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

のようなものを使用attr_accessorして値のゲッターとセッターを生成できることはわかっていますが、 を使用するなど、よりきれいな方法でこれを行うことができるかどうか興味があります+=

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​​ 演算子のリストを参照してください。

Ruby ではx += y常に を意味しx = x + yます。+=特定の forの意味を変更する唯一の方法は、xをオーバーライド+することx.classです。ただし、+セマンティクスが異なり、ユーザーはおそらく+新しいオブジェクトを返すことを期待しています。元のを+返すと、x一部のユーザーが混乱する可能性があります。別のオブジェクトを+返すとx、あなたの例でその他のオブジェクトを指すことになります。私があなたの質問を理解している限り、それは望ましくありません。

于 2013-09-06T18:48:18.687 に答える