Project1

标题: attr_reader是什么意思 [打印本页]

作者: yang1zhi    时间: 2016-4-15 13:08
标题: attr_reader是什么意思
F1解释看不懂

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

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

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

CLASS里面的DEF不是本来就可以通过  .  来读写的吗。
作者: cinderelmini    时间: 2016-4-15 15:13
常规意义上:
  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
复制代码

作者: wolves    时间: 2016-4-15 15:42
本帖最后由 wolves 于 2016-4-15 15:43 编辑

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

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



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

然后再说说ruby里的属性。实际上ruby里的对象是没有属性这个概念的。当我们为一个类定义属性时,实际上是定义了两个拟态方法:
RUBY 代码复制
  1. class MyClass
  2.         def attribute=(value)
  3.                 @attribute = value
  4.         end
  5.         def attribute
  6.                 @attribute
  7.         end
  8. end
  9.  
  10. myclass = MyClass.new
  11. myclass.attribute = 233
  12. p myclass.attribute   # => 233


拟态方法(Mimic Method)


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

RUBY 代码复制
  1. #attr* 系列方法的简单非官方实现
  2. class Class
  3.         def my_attr_reader(attr_name)
  4.                 define_method(attr_name) do
  5.                             instance_variable_get('@' + attr_name.id2name)
  6.                   end
  7.         end
  8.  
  9.         def my_attr_writer(attr_name)
  10.                 define_method( (attr_name.id2name + '=').to_sym ) do |value|
  11.                             instance_variable_set('@'+attr_name.id2name, value)
  12.                   end
  13.         end
  14.  
  15.         def my_attr_accessor(attr_name)
  16.                 my_attr_reader(attr_name)
  17.                 my_attr_writer(attr_name)
  18.         end
  19. end
  20.  
  21. class MyClass
  22.         my_attr_accessor :params
  23. end
  24.  
  25. myclass = MyClass.new
  26. p myclass.params   # => nil
  27. myclass.params = 233
  28. p myclass.params   # => 233






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1