我有一个代码:
class A
attr_accessor :somevar
def a
somevar = 'something'
puts @somevar
end
def b
send :somevar=, 'something'
puts @somevar
end
end
A.new.a #=> nil
A.new.b #=> 'something'
为什么会有差异?为什么我不能通过编写器分配一个实例变量?但是为什么创建了局部变量而不是调用了方法(setter)呢?
最佳答案
attr_accessor :somevar
引用instance 变量@somevar
。实例变量前面必须有 @
符号。方法中没有 @
符号的所有其他变量(如“somevar”)只是该方法或范围的局部变量,而不是对象的实例变量。
因此,将方法“a”中的第一行更改为
@somevar = 'something'
将得到您期望的答案。
相关说明:您不必在 Ruby 中声明实例变量,您只需使用 @somevar
类型表示法创建它们。 attr_accessor
方法为该实例变量创建 setter 和 getter。
Ruby 中的方法附加到对象,所以为了让类 A 调用它自己的 somevar setter 方法,您需要编写 self.somevar = 'something'
,否则 Ruby 解析器认为您只是在创建一个局部变量。
这可能会造成混淆,因为您可以从 b
调用方法 a
,只需执行以下操作:
def b
send :somevar=,'something'
puts @somevar
a # would invoke its own method 'a'
end
但是 setter 方法 somevar=
对于创建具有相同符号的局部变量是不明确的:
somevar='something' # Ruby assumes you want to create a local variable
因此,要调用 somevar setter 方法,您需要明确说明您正在调用 self 方法:
self.somevar = 'something'
当您调用 send :somevar=,'something'
时,您也在调用 somevar 实例方法。
关于Ruby:从内部方法访问 attr_accessor 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913544/