我已经定义了一个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
那么,出了什么问题?
提前致谢。对不起,如果这可能是一个太明显的问题。
答案 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