Ruby + =重载

这有什么问题?

class Vec2 attr_accessor :x, :y # ... def += (v) @x += vx @y += vy return self end # ... end 

我在网上找不到太多东西。 有人说这是因为在ruby中+ =完成调用+然后=,他开玩笑吧?

在有趣的情况下,他是对的,是否有一些解决方法(除了定义一个名为“添加”的方法)?

有人说这是因为在ruby中+ =完成调用+然后=,他开玩笑吧?

不,他是对的(除了“calling =”有点不准确,因为=不是方法)。

是否有一些解决方法(除了定义一个名为“添加”的方法)?

你的意思是除了定义+并生活在+=将改变变量而不是对象的事实?

你可以改变+来改变对象然后返回self ,在这种情况下, v1 += v2将与v1 + v2相同并且会改变对象。 然而,我强烈反对这一点,因为没有人会期望+会发生变异(同样大多数ruby识字的人会期望+=重新分配变量并且不会改变对象,所以试图改变它可能完全是不可取的)。

除此之外,不,没有办法解决这个问题。

他是对的。 +=是排序的语言构造,它将变量引用设置为等于隐含+操作的结果。 +=实际上永远不会是一个方法,并按预期行事:

 a = [1, 2, 3] b = a b << 4 b += [5, 6, 7] pa # => [1, 2, 3, 4] pb # => [1, 2, 3, 4, 5, 6, 7] 

这里的ab都包含对同一个对象的引用,这就是为什么运行<<b添加元素也会影响a 。 但是,正如我们所看到的, +=不应该修改对象本身; 它应该改变存储在该变量中的内容,这就是为什么a的值不受影响的原因。

它真的完全等同于速记。

 b = a + [5, 6, 7] 

以这种方式编写,您希望形成一个新数组,并保持相同。 +=正是这样的简写,因此不会以任何方式改变a

您始终可以定义自己的+以返回新的矢量。

 def +(v) new_vector = self.class.new new_vector.x = @x + vx new_vector.y = @y + vy new_vector end