class Foobar
def initialize
self.placeHolder = ''
end
end
bbq = Foobar.new
當我運行下面的代碼時,我收到一個NoMethodError
。這對我來說非常混亂,爲什麼我不能有一個空的實例變量?我知道我可以有一個空的類變量,但是如果我包含self
它會給我這個錯誤?對象變量不能爲空?
class Foobar
def initialize
self.placeHolder = ''
end
end
bbq = Foobar.new
當我運行下面的代碼時,我收到一個NoMethodError
。這對我來說非常混亂,爲什麼我不能有一個空的實例變量?我知道我可以有一個空的類變量,但是如果我包含self
它會給我這個錯誤?對象變量不能爲空?
你的代碼試圖調用你的類沒有的placeHolder=
方法。
@placeHolder = ''
應該爲你工作。
或者,你可以加入這一行類:
attr_accessor :placeHolder
它會自動爲你創建一個getter和setter方法。請參閱this answer以獲得很好的解釋。
當你在做的紅寶石someObject.someName
,總是意味着調用someName
方法上someObject
。 (現在你可以僞造一些其他類型的行爲,因爲你可以定義一個method_missing
方法來處理不存在的方法時)。所以,當你做self.someName
時,這意味着在類的某個實例上調用someName
方法。
您試圖調用Foobar類的實例方法placeHolder=
。 Foobar類沒有這個方法,所以它正確地給你一個NoMethodError。如果你想設置一個實例變量,那麼這樣做的語法是@placeholder = ''
。如果您想要使用訪問器方法,您需要自己寫一個或者在課程體中包含attr_accessor :placeHolder
。
(順便說一句,它是慣用的Ruby中使用snake_case而非駝峯。)
這是因爲attr_accessors不在類Foobar的定義。
attr_accessor :placeholder
好酷。但爲什麼self.identifier會創建一個方法呢?我來自Python背景,這就是爲什麼我們在那裏聲明對象變量的原因。爲什麼會自動採用它的方法? –
在答案中增加了一些更多的細節,希望能夠涵蓋您的問題 – JKillian