He was right. += is a language construct of sorts, that sets the variable reference equal to the result of the implied + operation. += can never actually be a method and behave as expected:
a = [1, 2, 3]
b = a
b << 4
b += [5, 6, 7]
p a # => [1, 2, 3, 4]
p b # => [1, 2, 3, 4, 5, 6, 7]
a and b here both contain references to the same object, which is why running << to add an element to b also affects a. As we can see, however, += isn't supposed to modify the object itself; it's supposed to change what's being stored in that variable, which is why the value of a is here untouched.
It really is exactly equivalent to the longhand.
b = a + [5, 6, 7]
Written that way, you expect a new array to be formed, and for a to remain the same. += is shorthand for exactly that, so does not mutate a in any way.
You can always define your own + to return a fresh vector.
def +(v)
new_vector = self.class.new
new_vector.x = @x + v.x
new_vector.y = @y + v.y
new_vector
end