Ruby实例变量语法约定

时间:2011-11-23 21:47:31

标签: ruby coding-style syntax

在实例方法中引用实例变量的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@qself.q

2 个答案:

答案 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方面非常有启发性。