2012-08-02 176 views
0

Ruby 1.9Ruby中的實例變量

我突然意識到我不明白如何在Ruby中定義和初始化實例變量。它必須使用只有在一定class並且根本不能從一個類訪問,所以attr_accessorattr_reader是不是我所需要的。

class MyClass 

    #how do I initialize it? 
    @my_var = 'some value' 

    def method1 
    #I need to do something with @my_var 
    puts @my_var 
    end 
    def method2 
    #I need to do something with @my_var 
    puts @my_var 
    end 
end 

a = MyClass.new 
a.method1 #empty 
a.method2 #empty 

所以,我發現還有另一種方式來做到這一點

class MyClass 

    #is this the only way to do it? 
    def initialize 
    @my_var = 555 
    end 

    def method1 
    #I need to do something with @my_var 
    puts @my_var 
    end 

    def method2 
    #I need to do something with @my_var 
    puts @my_var 
    end 
end 

a = MyClass.new 
a.method1 #555; it's ok 
a.method2 #555; it's ok 

那麼,是第二種方法是正確的?

回答

3

每一類有一個initialize()方法,它的作用類似於其他語言的構造函數,實例變量應該有初始化:

class MyClass 

    def initialize 
    @my_var = 'some value' 
    end 

    # etc... 
end 
+0

他們只能在方法(構造器)來初始化'初始化()'?這是我的問題。 – Alexandre 2012-08-02 14:23:39

+0

它們可以在任何實例方法中初始化,但'initialize'是任何給定實例調用的第一個方法,所以它是最好的方法。 – tadman 2012-08-02 14:26:53

+0

爲什麼不能通過任何方法初始化? 'class MyClass @my_var ='some value'; end'? – Alexandre 2012-08-02 14:45:52

2

是,initialize纔是正道。

但你也可以做:

class MyClass 

    def method1 
    #I need to do something with @my_var 
    puts @my_var ||= 555 
    end 

    def method2=(x) 
    #I need to do something with @my_var 
    puts @my_var = x 
    end 
end 

#Test: 
x = MyClass.new 
x.method1  #555 
x.method2= 44 #44 
x.method1  #44 

method1被稱爲第一次,它初始化變量。

編輯: 預期它不工作,當您分配nil

x = MyClass.new 
x.method1   #555 
x.method2= nil #nil 
x.method1   #again 555 

這個版本更好地工作:

class MyClass 

    def method1 
    @my_var = 555 unless defined? @my_var 
    puts @my_var 
    end 

    def method2=(x) 
    puts @my_var = x 
    end 
end 

x = MyClass.new 
x.method1   #555 
x.method2= nil #nil 
x.method1   #keeps nil 
+0

這是懶惰的定義模式。 – tadman 2012-08-02 14:28:25