Он был прав.+=
- это своего рода языковая конструкция, которая устанавливает ссылку на переменную равной результату подразумеваемой операции +
.+=
никогда не может быть методом и вести себя так, как ожидается:
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
и b
здесь содержат ссылки на один и тот же объект, поэтому при запуске <<
для добавления элементана b
также влияет a
.Однако, как мы видим, +=
не должен изменять сам объект;он должен изменить то, что хранится в этой переменной, поэтому значение a
здесь не трогается.
Это действительно в точности эквивалентно от руки.
b = a + [5, 6, 7]
Написано, чтоКстати, вы ожидаете, что новый массив будет сформирован, и a
останется прежним.+=
является сокращением именно для этого, поэтому не изменяет a
.
Вы всегда можете определить свой собственный +
для возврата нового вектора.
def +(v)
new_vector = self.class.new
new_vector.x = @x + v.x
new_vector.y = @y + v.y
new_vector
end