查看: 2483|回复: 3

[已经解决] attr_reader是什么意思

[复制链接]
梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2016-4-15 13:08:54 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
F1解释看不懂

attr_accessor(name ... )
为 name 属性定义读取和写入的方法。name 可以是 Symbol 或字符串。

attr_reader(name ... )
定义 name 属性的读取方法。name 可以是 Symbol 或字符串。

attr_writer(name ... )
定义 name 属性的写入方法(name=)。name 可以是 Symbol 或字符串。

CLASS里面的DEF不是本来就可以通过  .  来读写的吗。

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2016-4-15 15:13:16 | 显示全部楼层
常规意义上:
  1. attr_accessor :some   等于:
  2. def some=(some)
  3.   @some = some
  4. end
  5. def some
  6.   return @some
  7. end
复制代码
  1. attr_writer :some   等于:
  2. def some=(some)
  3.   @some = some
  4. end
复制代码
  1. attr_reader :some   等于:
  2. def some
  3.   return @some
  4. end
复制代码

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
175
在线时间
332 小时
注册时间
2013-7-6
回帖
316
发表于 2016-4-15 15:42:19 | 显示全部楼层
本帖最后由 wolves 于 2016-4-15 15:43 编辑

我来解释一下,在ruby的类里以@开头的变量被称为实变量,每一个对象的实变量都是独立的,默认情况下,我们在构造方法中初始化这些实变量,而这些变量默认是不允许直接用 对象名.实变量名 来读 和对象名.实变量名=值 来读写的。ruby提供了三种方法,分别是
1. attr_accessor(实变量同名符号)#可读可写
2.attr_reader(实变量同名符号)#可读
3.attr_writer(实变量同名符号)#可写
ruby里没有直接的属性,只能通过实变量和上述函数构造属性

点评

原来如此,这么说我就懂了。就是用来让@变量可以 . 出来  发表于 2016-4-15 19:53

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

偶是熬夜学编程的傻子
回复

使用道具 举报

梦石
0
星屑
4623
在线时间
1207 小时
注册时间
2016-4-7
回帖
944

开拓者

发表于 2016-4-15 16:13:46 | 显示全部楼层
本帖最后由 shitake 于 2016-4-15 22:43 编辑

感谢 晴兰 的提醒,更正了之前“类宏是单件方法”的错误。。。实际上从下边定义my_attr_* 就可以看出。。。单件方法的话应该是 def self.my_attr_* 。囧



attr_* 系列的方法,通常被称为类宏(class macro Metaprogramming Ruby 2 p116)。所谓类宏,就是在一个类定义中使用一个类方法 ,这个类方法对该类做了宏扩展。

然后再说说ruby里的属性。实际上ruby里的对象是没有属性这个概念的。当我们为一个类定义属性时,实际上是定义了两个拟态方法:
[pre lang="ruby"]class MyClass
        def attribute=(value)
                @attribute = value
        end
        def attribute
                @attribute
        end
end

myclass = MyClass.new
myclass.attribute = 233
p myclass.attribute   # => 233[/pre]

[fold=拟态方法(Mimic Method)]所谓拟态方法,就是一个方法伪装成其他东西(如关键字 )。最常见的一个例子就是puts方法。他看起来像是一个关键字,但实际上是Kernel模块里定义的一个方法。另外private/protected也是拟态方法哦。虽然这些方法在一些编辑器内会被高亮,但任然改变不了他们是一个方法的事实。而这样的方法就被成为拟态方法。[/fold]

像上面例子里定义的 attribute/attribute= 的这一类方法,通常又被称为访问器。如果每一个属性都通过这样来手工定义,则会十分繁琐。因此有了attr_* 这一系列的方法。这些方法定义在Module类中。attr_reader 定义了读的方法,attr_writer 定义了写的方法,attr_accessor 定义了读写的方法。

[pre lang="ruby"]#attr* 系列方法的简单非官方实现
class Class
        def my_attr_reader(attr_name)
                define_method(attr_name) do
                            instance_variable_get('@' + attr_name.id2name)
                  end
        end

        def my_attr_writer(attr_name)
                define_method( (attr_name.id2name + '=').to_sym ) do |value|
                            instance_variable_set('@'+attr_name.id2name, value)
                  end
        end

        def my_attr_accessor(attr_name)
                my_attr_reader(attr_name)
                my_attr_writer(attr_name)
        end
end

class MyClass
        my_attr_accessor :params
end

myclass = MyClass.new
p myclass.params   # => nil
myclass.params = 233
p myclass.params   # => 233[/pre]

点评

这个明明是类作为实例的实例方法……  发表于 2016-4-16 10:29
类宏并不是单件方法,本身就是实例方法。  发表于 2016-4-15 22:04

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 精品文章

查看全部评分

附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部