我可以在我的班级中实现+ =来增加包含值吗?

时间:2013-09-06 18:44:16

标签: ruby

考虑

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>

3 个答案:

答案 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返回一个不同的对象,那么+会指向你示例中的其他对象,据我所知,你不想要这个问题。