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

那么,怎么了?

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

4

2 回答 2

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

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

于 2012-10-14T09:49:26.303 回答
2

正如@detunized 所提到的,您需要重载 + 运算符才能自动获取 += 运算符。

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

def +(value)
    @age + value
end
于 2012-10-14T09:52:22.900 回答