我很难理解Ruby中的attr_accessor。 有人能给我解释一下吗?


当前回答

Attr_accessor非常简单:

attr_accessor :foo

是以下操作的快捷方式:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

它只不过是一个对象的getter/setter

其他回答

属性访问器attr_accessor提供了两个免费方法。

就像在Java中,它们被称为getter和setter。

很多答案都给出了很好的例子,所以我就简单点。

# the_attribute

and

# the_attribute =

在旧的ruby文档中,#表示方法。 它还可以包含一个类名前缀… MyClass # my_method

Attr_accessor只是一个方法。(这个链接应该提供更多关于它如何工作的见解——看看生成的方法对,一个教程应该告诉你如何使用它。)

关键在于,类在Ruby中不是定义(在c++和Java等语言中“只是定义”),而是求值的表达式。在此求值期间,调用attr_accessor方法,该方法反过来修改当前类——记住隐式接收器:self。其中self是此时“打开”的类对象。

对attr_accessor和friends的需求是:

像Smalltalk一样,Ruby不允许在该对象的method1之外访问实例变量。也就是说,不能像在Java甚至Python中那样以x.y形式访问实例变量。在Ruby中,y总是被当作一个要发送的消息(或“要调用的方法”)。因此attr_*方法创建包装器,通过动态创建的方法代理实例@变量访问。 样板很糟糕

希望这能澄清一些细节。快乐的编码。


1严格来说,这并不正确,有一些“技术”围绕这一点,但没有语法支持“公共实例变量”访问。

基本上,它们伪造了Ruby所不具备的公开可访问的数据属性。

定义此模块的命名属性,其中名称为symbol。Id2name,创建实例变量(@name)和读取它的相应访问方法。还创建一个名为name=的方法来设置属性。

module Mod
  attr_accessor(:one, :two)
end
Mod.instance_methods.sort   #=> [:one, :one=, :two, :two=]

嗯。很多很好的答案。这是我的一些看法。

attr_accessor是一个简单的方法,可以帮助我们清理(DRY-ing)重复的getter和setter方法。 这样我们就可以更专注于编写业务逻辑而不用担心setter和getter。