考虑
class Container
def initialize(value = 0)
@value = value
end
def + (other)
return @value + other
end
def - (other)
return @value - other
end
def * (other)
return @value * other
end
def / (other)
return @value / other
end
def get
return @value
end
end
我想使用+=
来增加容器中的值,如下所示:
c = Container.new(100)
c += 100
print c.get # Expecting 200
上述操作无效,因为100
会覆盖c
。
我知道我可以使用像attr_accessor
这样的东西为值生成一个getter和setter,但我很好奇我能否以更漂亮的方式执行此操作,例如使用+=
。< / p>
答案 0 :(得分:10)
由于c += 100
只是c = c + 100
的糖,因此您无法逃避覆盖c
。但是你可以用类似的对象覆盖它(而不是像你的问题中的fixnum)。
class Container
def initialize(value = 0)
@value = value
end
def + (other)
Container.new(@value + other)
end
def get
@value
end
end
c = Container.new(100)
c += 100
c.get # => 200
答案 1 :(得分:3)
x += y
只是x = x + y
的语法糖。因此,您只需在班级中实施+
即可免费获得+=
。
答案 2 :(得分:1)
不,你不能超载+=
。有关可重载运算符的完整列表,请参阅list of ruby operators that can be overridden/implemented。
在Ruby中x += y
始终意味着x = x + y
。更改给定+=
的{{1}}含义的唯一方法是覆盖x
中的+
。但是,x.class
具有不同的语义,用户最可能期望+
返回一个新对象。如果您+
返回原始+
,则可能会使您的某些用户感到困惑。如果你让x
返回一个不同的对象,那么+
会指向你示例中的其他对象,据我所知,你不想要这个问题。