如何读取同一个类中的访问器设置的实例变量?

时间:2015-11-06 19:57:42

标签: ruby instance-variables accessor

我有一个好奇心,哪个是访问实例变量的首选方法中定义了该实例变量的访问者的类。

一种方法是直接引用实例变量:

class Example
  attr_accessor :attribute

  def meth
    puts @attribute
  end
end

另一种方法是调用访问者创建的阅读器:

class Example
  attr_accessor :attribute

  def meth
    puts attribute
  end
end

这是一个小小的差异,但我很好奇这是首选的方法和原因。我在读者和直接实例变量访问上看到的唯一优势是在测试中更容易存根读者。

1 个答案:

答案 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