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]
这里的a
和b
都包含对同一个对象的引用,这就是为什么运行<<
向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