• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

[No000011]Ruby之attr_reader,attr_writer,attr_accessor理解&用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

(Ruby/Python/Perl)

  Ruby 语言与Python和Perl的一个很大区别,在于Ruby中,所有的实例变量都是在类中完全私有的,只能通过accessor 方法来进行变量访问,引用一段代码来说明具体的使用方法:

class Rectangle
    attr_accessor :width
    attr_accessor :height
    attr_accessor :width2
    attr_accessor :height2

    def initialize(wdth, hgt)
        @width = wdth
        @height = hgt
    end

    def area()
        return @width * @height
    end

    def area2()
        return @width2 * @height2
    end

end

r = Rectangle.new(2,3)
r.width = 5    # give samename's variable value 给同名变量的变量赋值
r.height = 5
puts r.area()  # outputs is 25

r.width2 = 6   # not samename's variable create 无同名变量的变量创建
r.height2 = 6
puts r.area2() # outputs is 36

attr_reader: 实例变量只读  attr_writer: 实例变量可写  attr_accessor: 变量可读可写

   近来学习ruby的过程中,看到了拟态方法的概念,感觉很有意思。我们都知道拟态方法在ruby中无处不在,可以让代码更清爽更容易理解,比如

  obj.my_attribute=""就不必写成obj.my_attribute=(""),而更进一步的,像attr_accessor这样的类宏的实现方式也引起了我的兴趣。

看了网上的实现方式,自己动手试了一下。

 

class Module
    def var( method_name )
        inst_variable_name = "@#{method_name}".to_sym    # .to_sym
        p inst_variable_name        #:=>:@bar

        define_method method_name do
            instance_variable_get inst_variable_name
        end

        define_method "#{method_name}=" do |new_value|
            instance_variable_set inst_variable_name, new_value
        end

    end
end

class Foo
    var :bar
end

f = Foo.new            # p f.bar
p f.class              #:=>Foo
p f.class.instance_methods(false)      #:=>["bar", "bar="]
f.bar = "good"                         #:=>"good" method bar=
p f.bar                                #:=>"good" method bar

上面的var方法就类似于attr_accessor,对其中的instance_variable_get用代码进行一下说明:

class Fred
#attr_accessor :a #不要去掉注释,先直接运行
#attr_accessor :b

    def initialize(p1, p2)
        @a, @b = p1, p2
    end
end
fred = Fred.new('cat', 99)
puts fred.instance_variable_get(:@a)  #=> "cat"
puts fred.instance_variable_get("@b") #=> 99
#puts fred.a,fred.b,fred.a.class,fred.b.class 
=begin 上一句结果
cat
99
String
Fixnum
=end

 我们都知道在ruby中:a等价于"a"但用前面的方法会更清爽,并且少写一个符号。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Ruby线程--生产者、消费者发布时间:2022-07-14
下一篇:
Ruby元编程:动态添加类属性及其实际应用发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap