如何将实例变量赋予getter?

时间:2013-08-10 18:59:29

标签: ruby

我有一个实例变量,如果请求时它是nil,我想设置它。这样的事情是正确的,还是会引起问题呢?

class Something
    attr_accessor :var

    def initialize
        @var
    end

    def var
        if @var == nil
            #Something which determines a value for var
        end
        @var
    end
end

2 个答案:

答案 0 :(得分:3)

class Something
    attr_writer :var

    def initialize
        @var 
    end

    def var 
        @var ||= 12
    end
end

foo = Something.new
foo.var
# => 12
foo.var = 15
foo.var
# => 15

答案 1 :(得分:1)

据我所知,您的代码不会出现任何重大问题。在使用未初始化的实例变量之前,您可能需要考虑一件事。如果在执行var方法时打开警告(例如ruby -w foo.rb),则会出现“警告:实例变量@var未初始化”。 Avdi Grimm指出“不需要显式声明和初始化的实例变量的问题在于它很容易拼错它们”(devblog.avdi.org/2011/06/23/how-ruby-helps-you-fix-your-broken-code/)。因此,您需要考虑这一点。

我要提到的另一件事是,正如knut指出的那样,如果你自己定义getter方法,则不需要使用attr_accessor。 attr_writer就足够了。