无法重载operator + =

时间:2012-10-14 09:45:03

标签: ruby operator-overloading

我已经定义了一个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

那么,出了什么问题?

提前致谢。对不起,如果这可能是一个太明显的问题。

2 个答案:

答案 0 :(得分: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

但在这种情况下,我认为不是很可读。

答案 1 :(得分:2)

如@detunized所述,您需要重载+运算符以自动获取+ =运算符。

此外,您的运算符定义不应包含类的名称,它应该是

def +(value)
    @age + value
end