2

考虑

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.

我知道我可以使用类似 an 的东西attr_accessor来生成值的 getter 和 setter,但我很好奇我是否可以用更漂亮的方式来做到这一点,比如使用+=.

4

3 回答 3

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
于 2013-09-06T18:48:55.487 回答
3

x += y只是 . 的语法糖x = x + y。所以你只需要+在你的课堂上实现,你就+=可以免费获得。

于 2013-09-06T18:48:27.960 回答
1

不,你不能超载+=。有关可重载运算符的完整列表,请参阅可以覆盖/实现的 ruby​​ 运算符列表。

在 Rubyx += y中总是意味着x = x + y. +=改变给定含义的唯一方法x是覆盖+in x.class。但是,+具有不同的语义,用户很可能期望+返回一个新对象。如果您+返回原件x,可能会使您的一些用户感到困惑。如果您+返回一个不同的对象,那么x将在您的示例中指向另一个对象,据我了解您的问题,您不希望这样。

于 2013-09-06T18:48:18.687 回答