2012-10-14 135 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