2011-05-23 35 views
-3
class MyClass 

    def instance_variable=(var) 
    puts "inside getter" 
    instance_variable = var 
    end 

    def function_1 
    self.instance_variable = "whatever" 
    end 

    def function_2 
    @instance_variable = "whatever" 
    end 

end 



myclass = MyClass.new 

myclass.function1 

室內用結果 「內吸」 在控制檯上我猜有些紅寶石內部構件

myclass.function2

沒有。

進出口新的紅寶石,不知道其中的差別,無法找到它在網絡上...

提前感謝!

編輯:

我假定通過附加「=」,我會覆蓋一個隱式定義的實例變量的吸氣劑的方法「instance_variable」。

這也是我爲什麼這樣稱呼它的原因。

我不習慣在函數名中使用「=」。

這就是爲什麼我認爲它會有一些特殊的含義。

感謝您的幫助。

EDIT2:

我只是想我真的覆蓋分配,不只是吸氣。我把這一切搞混了。

對不起,謝謝。

回答

4

你有(誤導)命名你的二傳手instance_variable。它不是一個實例變量,它是一個設置實例變量的方法。

當您致電self.instance_variable=時,您正在調用該方法。當您直接設置@instance_variable時,您正在設置變量本身,這就是爲什麼不調用setter方法的原因。

更慣用的命名規則是這樣的:

def name=(value) 
    @name = value 
end 

當然,對於簡單地說,通過式getter和setter可以使用

attr_reader :name #generates getter only 
attr_writer :name #generates setter only, not very common 
attr_accessor :name #generates getter and setter 

上述方法是語法糖它爲您生成獲取和/或設置方法。如果需要,可以稍後重寫它們以提供附加功能。


編輯:我看到你做了更新,並只是想指出的是,這種方法並沒有設置一個實例變量都:

def instance_variable=(var) 
    puts "inside getter" 
    instance_variable = var 
end 

在這種情況下instance_variable簡直是局部變量,並在方法退出後立即丟棄。局部變量優先於實例方法,實例變量始終以@符號開頭。

+0

但是ruby並沒有爲你做這件事,除非你使用我在答案中顯示的attr_xxx語法。 – 2011-05-23 18:03:37

+0

我想要的是一個實例變量。 沒有辦法明確地定義它,這就是爲什麼我調用方法本身「instance_variable =」。 我所假設的是,附加「=」符號使其成爲實例變量「instance_variable」的getter。就像覆蓋它一樣。 但現在我認爲,「=」不這樣做。 它只是一個字符?像「a-z」? – krzysiek 2011-05-23 18:08:08

+0

@krzysiek:*「沒有辦法明確定義它」* - 我不確定你的意思。你當然可以定義一個實例變量,你只需聲明並初始化它,即'@some_instance_var = 1'。方法末尾的'='會使它成爲setter,而不是getter,它確實有意義。這意味着你可以像'my_property = 1'一樣使用它,即它看起來像分配一個字段,但實際上你正在調用'my_property =(value)'方法。 – 2011-05-23 19:22:48