2010-08-21 126 views
2

是不是+運營商?爲什麼不能定義?爲什麼我得到「未定義的方法」+'爲零:NilClass「?

這裏是我的代碼:

Class Song 
    @@plays = 0 
    def initialize(name, artist, duration) 
    @name = name 
    @artist = artist 
    @duration = duration 
    @plays = 0 
    end 
    attr_reader :name, :artist, :duration, 
    attr_writer :name, :aritist, :duration 
    def play 
    @plays += 1 
    @@plays += 1 
    "This Song: #@plays play(s). Total #@@plays plays." 
    end 
    def to_s 
    "Song: #@name--#@artist (#@duration)" 
    end 
end 
+3

line,stacktrace ... – clyfe 2010-08-21 13:12:48

+0

不相關,但我建議不要使用同名的類和實例變量;而是命名類變量「@@ total_plays」或類似的東西。否則就太容易犯錯了。 – 2012-08-23 14:24:28

回答

4

首先,該代碼甚至不運行:class在1號線需要用小寫字母c拼寫,你不能有最後一個項目之後逗號在一份聲明中(您的attr_reader一行)。在修復那些並運行Song.newSong#playSong#to_s後,我沒有得到NoMethodError

不管怎麼說,你總是會得到那個NoMethodError當您嘗試添加什麼nil值:

>> nil + 1 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):1 
>> nil + nil 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):2 
>> # @foo is not defined, so it will default to nil 
?> @foo + 2 
NoMethodError: undefined method `+' for nil:NilClass 
    from (irb):4 

所以,你可能會嘗試添加一些未初始化的實例變量...或者,它可能做任何事情。如果你想得到正確的幫助,你總是需要發佈完整的最小代碼來複制錯誤。

3

+被定義在數字(等等)上。但是,如錯誤消息所述,它沒有在nil上定義。這意味着你不能做nil + something,你爲什麼?

話雖這麼說,你實際上不叫nil + something中還有你的代碼的任何地方(你初始化兩個@plays@@plays爲0,你也不會在任何時候將它們設置爲nil)。事實上,一旦刪除了兩個語法錯誤(Class應該是class,並且在:duration之後應該沒有逗號),代碼就會正常運行。所以錯誤不在你顯示的代碼中。

0

也許你應該在初始化方法中包含@@plays = 0

+0

爲什麼?這是一個在聲明時初始化爲0的類變量。 – 2012-08-23 14:23:40

相關問題