我有一个好奇心,哪个是访问实例变量的首选方法在中定义了该实例变量的访问者的类。
一种方法是直接引用实例变量:
class Example
attr_accessor :attribute
def meth
puts @attribute
end
end
另一种方法是调用访问者创建的阅读器:
class Example
attr_accessor :attribute
def meth
puts attribute
end
end
这是一个小小的差异,但我很好奇这是首选的方法和原因。我在读者和直接实例变量访问上看到的唯一优势是在测试中更容易存根读者。
答案 0 :(得分:1)
最好通过访问者。例如,如果您直接访问实例变量,然后稍后使用reader转换该值,则直接访问实例变量将不会看到该更改。
当您要使用访问器设置实例变量的值时,使用访问器而不是直接访问实例变量会导致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