如何读取由同一类中的访问者设置的实例变量



我很好奇,在定义了实例变量访问器的类中,访问实例变量的首选方式是什么。

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

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

相关内容

  • 没有找到相关文章

最新更新