在实例方法中引用实例变量的Ruby约定是什么?
考虑以下变化:
def MyClass
attr_accessor :q
def initialize(z)
@q = z
end
def method_one
puts q
end
def method_two
puts @q
end
def method_three
puts self.q
end
end
首选哪种约定q
,@q
或self.q
?
答案 0 :(得分:4)
Ruby使用实例变量和访问器方法的全部原因(使用语法糖来看起来就像你可以直接访问属性一样)是因为你可以重构你的类和你的外部消费者接口
puts musicObj.minutes
不必知道你内部是否有:
attr_accessor :minutes
或
def minutes
@seconds / 60.0
end
同样的理性同样适用于您自己的代码。如果您有一个包含100个方法的类,它们都引用了您的@minutes
,然后您决定确实应该存储@seconds
,则需要更改100个方法。另一方面,如果您使用了minutes
(您的“method_one”),则不需要更改任何方法。
使用方法调用表示法而不是直接访问实例变量会有很小的性能损失。如果速度严重,您可能需要考虑直接访问;否则,我鼓励你吃自己的狗粮,并使用你公开的任何可公开访问的界面。
并且,正如@Alex回答的那样,在调用'setter'方法时必须使用self.foo = 42
表示法,因为foo = 42
将始终设置局部变量。 < / p>
答案 1 :(得分:3)
self.q
self.q = 'Some value.'
而获取变量时使用q
puts q
do_something_with_variable(q)
当然,这些纯粹是惯例。当获取变量时,您可以将self.q
替换为q
(尽管建议使用一致性)。
我发现this discussion在使用@q
方面非常有启发性。