设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2047|回复: 3
打印 上一主题 下一主题

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

跳转到指定楼层
1
发表于 2016-4-15 13:08:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
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 手动认可奖励

查看全部评分

Lv3.寻梦者

梦石
0
星屑
4598
在线时间
1206 小时
注册时间
2016-4-7
帖子
982

开拓者

4
发表于 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里的对象是没有属性这个概念的。当我们为一个类定义属性时,实际上是定义了两个拟态方法:
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

点评

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

评分

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

查看全部评分

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
155
在线时间
332 小时
注册时间
2013-7-6
帖子
356
3
发表于 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 认可答案

查看全部评分

偶是熬夜学编程的傻子
回复 支持 反对

使用道具 举报

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9397
在线时间
2748 小时
注册时间
2008-9-5
帖子
3543

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

2
发表于 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 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-30 08:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表