2013-06-29 75 views
1

如果我有這樣一個類:爲什麼'self'需要從其構造函數中調用Ruby方法?

class Person 

    def initialize(options={}) 
    self.name = options[:name] 
    end 

    def name=(name) 
    @name = name 
    end 

end 

...那麼「NAME =」方法被調用和我得到了我的期望。但是,如果我改變的例子稍微從呼叫放棄「自我」的名字=',則方法不會被調用:

class Person 

    def initialize(options={}) 
    name = options[:name] 
    end 

    def name=(name) 
    @name = name 
    end 

end 

這是爲什麼?爲什麼要'自我'在那裏?我的印象是隱含的「自我」會在'初始化'構造函數中按預期設置,因此會像第一個例子那樣行事。

+0

順便說一句,self需要不僅在構造函數中調用訪問器,而且在其他所有實例方法中也是如此 –

+0

這當然是與其標記爲重複的問題*相關的,但在某人知道所問的問題時在標記的副本中,這個問題已經得到解答。這個問題是關於'initialize'中調用的所有實例方法需要'self.'的外觀。訪問者需要'self.'這個事實就是這個問題的答案。 –

回答

7

Ruby不知道你是否想創建一個名爲「name」的本地變量或使用成員變量。

self.name告訴它你想使用成員變量。

沒有任何語法說你想創建一個局部變量,所以必須是默認的。

(另外,成員變量是不是真實的,但你知道我的意思)

+3

請注意,這不僅是在初始化過程中的情況,而且在任何實例方法中都是如此。 –

+2

@xaxxon,成員變量的Ruby術語將是'實例方法' –

+0

@ThongKuah是的,我討厭這個。因爲它們有兩個不同的邏輯目的。 – xaxxon

-2

爲什麼「自我」需要從它的構造函數中調用一個Ruby方法?

一般來說,它不是:

class Person 
    def initialize(options={}) 
    set_name(options[:name]) # Calls `set_name` method; no `self.` required 
    end 

    def set_name(name) 
    @name = name 
    end 
end 

在你的代碼的需要self.無關,在構造函數是:你可以從initialize中調用任何正常的實例方法或其他地方類而不使用self.

這是怎麼回事,你正在嘗試調用一個setter方法(一個實例方法,其名稱以=結尾,例如name=),這些方法在Ruby中作爲特例處理。

根據Ruby編程語言

的規則是,當通過對象調用的賦值表達式只會調用setter方法。如果您想在定義它的類中使用setter,請通過self明確調用它。

所以,再一次,它不是紅寶石不知道什麼self指構造函數的執行過程 - 它 - 它是在這種情況下,你想叫一個setter,它需要通過調用一個東西。

在您的代碼中,name = options[:name]創建並設置一個名爲name的局部變量。

相關問題