2014-05-22 80 views
0
class Foobar 
    def initialize 
    self.placeHolder = '' 
    end 
end 

bbq = Foobar.new 

當我運行下面的代碼時,我收到一個NoMethodError。這對我來說非常混亂,爲什麼我不能有一個空的實例變量?我知道我可以有一個空的類變量,但是如果我包含self它會給我這個錯誤?對象變量不能爲空?

回答

3

你的代碼試圖調用你的類沒有的placeHolder=方法。

@placeHolder = '' 

應該爲你工作。

或者,你可以加入這一行類:

attr_accessor :placeHolder 

它會自動爲你創建一個getter和setter方法。請參閱this answer以獲得很好的解釋。


當你在做的紅寶石someObject.someName,總是意味着調用someName方法上someObject。 (現在你可以僞造一些其他類型的行爲,因爲你可以定義一個method_missing方法來處理不存在的方法時)。所以,當你做self.someName時,這意味着在類的某個實例上調用someName方法。

+0

好酷。但爲什麼self.identifier會創建一個方法呢?我來自Python背景,這就是爲什麼我們在那裏聲明對象變量的原因。爲什麼會自動採用它的方法? –

+0

在答案中增加了一些更多的細節,希望能夠涵蓋您的問題 – JKillian

2

您試圖調用Foobar類的實例方法placeHolder=。 Foobar類沒有這個方法,所以它正確地給你一個NoMethodError。如果你想設置一個實例變量,那麼這樣做的語法是@placeholder = ''。如果您想要使用訪問器方法,您需要自己寫一個或者在課程體中包含attr_accessor :placeHolder

(順便說一句,它是慣用的Ruby中使用snake_case而非駝峯。)

2

這是因爲attr_accessors不在類Foobar的定義。

attr_accessor :placeholder