Давайте создадим два массива:
a = [1, 2]
b = [3, 4]
Как и все объекты, эти массивы имеют уникальные идентификаторы объектов:
a.object_id #=> 48242540181360
b.object_id #=> 48242540299680
Теперь давайте сложим их вместе:
c = a + b #=> [1, 2, 3, 4]
Это создает новый объект (содержащий переменную c
):
c.object_id #=> 48242540315060
и оставляет (объекты, удерживаемые) a
и b
(и их идентификаторы объектов) без изменений:
a #=> [1, 2]
b #=> [3, 4]
Теперь давайте напишем:
a += b #=> [1, 2, 3, 4]
, который Ruby изменяет на:
a = a + b
при компиляции кода.Мы получаем:
a #=> [1, 2, 3, 4]
a.object_id #=> 48242541482040
Переменная a
теперь содержит новый объект, равный предыдущему значению a
плюс b
.
Теперь давайте объединим b
с (новое значение) a
:
a.concat(b) #=> [1, 2, 3, 4, 3, 4]
Это меняет ( мутирует ) a
, но, конечно, не меняет идентификатор объекта a
:
a #=> [1, 2, 3, 4, 3, 4]
a.object_id #=> 48242541482040
Наконец, мы можем заменить значение a
на c
, не затрагивая идентификатор объекта a
:
a.replace(c) #=> [1, 2, 3, 4]
a #=> [1, 2, 3, 4]
a.object_id #=> 48242541482040
См. Array # + , Array # concat и Array # replace .