我很好奇,在定义了实例变量访问器的类中,访问实例变量的首选方式是什么。
一种方法是直接引用实例变量:
class Example
attr_accessor :attribute
def meth
puts @attribute
end
end
另一种方法是调用访问者创建的读取器:
class Example
attr_accessor :attribute
def meth
puts attribute
end
end
这是一个很小的区别,但我很好奇哪种方法是首选的,为什么。与直接实例变量访问相比,我在读卡器上看到的唯一优势是更容易在测试中插入读卡器。
最好遍历访问器。例如,如果您直接访问实例变量,然后稍后使用读取器转换值,那么直接访问该实例变量将不会看到这种变化。
当您希望使用访问器设置实例变量的值时,使用访问器而不是访问实例变量会直接导致one small quirk
。
正常情况下,当你写:
some_meth 10
ruby会将其解释为:
self.some_meth(10)
但如果你写:
age = 10
ruby不会将其解释为:
self.age=(10)
相反,ruby将创建一个名为age
的局部变量,并将其设置为10,这对名为@age
的实例变量没有影响。
为了调用@age的setter,您必须显式地编写self
:
self.age = 10
下面是一个完整的例子:
class Dog
attr_reader :age
def age=(val)
@age = val * 7
end
def initialize val
self.age = val #age = val will not call the setter
end
end
d = Dog.new 10
puts d.age #=> 70