2012-10-14 132 views
1

我已經定義了Person類(名稱,年齡)。我試圖在@age實例變量上重載+ =運算符,但我沒有管理。在這裏我的腳本嘗試:未能超載運算符+ =

class Person 

    def initialize(name, age) 
     @name = name 
     @age = age 
    end 

    def age+= (value) 
     @age += value 
    end 

    def to_s 
     return "I'm #{@name} and I'm #{@age} years old." 
    end 
end 

laurent = Person.new "Laurent", 32 
puts laurent 
laurent.age += 2 
puts laurent 

這我在終端得到了錯誤:

person.rb:8: syntax error, unexpected tOP_ASGN, expecting ';' or '\n' 
    def age+= (value) 
      ^
person.rb:15: syntax error, unexpected keyword_end, expecting $end 

那麼,什麼是錯的?

在此先感謝。對不起,如果這可能是一個太明顯的問題。

回答

3

你必須定義+操盤手,即可自動+=

但在這種情況下,你不需要重寫+操作。 age成員只是一個數字,所以它已經定義了一切。你錯過的是attr_accessor

class Person 
    attr_accessor :age 

    def initialize(name, age) 
     @name = name 
     @age = age 
    end 

    def to_s 
     return "I'm #{@name} and I'm #{@age} years old." 
    end 
end 

laurent = Person.new "Laurent", 32 
puts laurent 
laurent.age += 2 
puts laurent 

你只需要覆蓋的情況下+運營商,你想你的類表現得像一個號碼,可以直接添加到它是這樣的:

laurent = Person.new "Laurent", 32 
laurent += 2 

但不是很可讀我的意見在這種情況下。

+0

這是工作,謝謝:)。只是爲了我的文化:如何才能超負荷運營商只是年齡?這可以與幾個成員(年齡,身高,體重)一起工作嗎? – loloof64

+0

你不能。你可以添加一個方法'grow_older(年)開始@age + =年底'例如改變年齡。 – detunized

+0

好的。非常感謝:) – loloof64

2

正如@detunized你需要重載+操作者自動獲得+ =運營商提及。

而且您的運營商定義不應包含類的名稱,它應該是

def +(value) 
    @age + value 
end 
+0

謝謝,但我仍然有一個錯誤與解決方案(第19行) – loloof64

+0

回答生命是42,但我們仍然在尋找合適的問題嗎?我的回答可以和你問的問題一樣好!你問運算符重載,我給出了答案,但似乎你不知道的問題 –

+0

我相信有關的問題,但是當我爲了實現您的解決方案改變了劇本,我得到了一個錯誤。也許我沒有做好這個過程,但我得到了一個語法錯誤。 – loloof64