如何读取同一个 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
我很好奇访问实例变量的首选方式是什么在 中 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