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

How to read instance variables set by accessors inside the same class?

我很好奇访问实例变量的首选方式是什么 中 class 已经为该实例变量定义了访问器。

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

class Example
  attr_accessor :attribute

  def meth
    puts @attribute
  end
end

另一种方法是调用访问者创建的 reader:

class Example
  attr_accessor :attribute

  def meth
    puts attribute
  end
end

差异很小,但我很好奇哪种方法是首选方法以及原因。我在 readers 上看到的与直接实例变量访问相比的唯一优势是在测试中更容易存根 reader。

最好通过访问器。例如,如果您直接访问实例变量,然后您稍后使用 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