Как я понимаю, это из-за использования памяти.
Когда вы инициализируете объект, Ruby сначала инициализирует объект в памяти. Затем переменная указывает на этот адрес памяти. Когда вы назначаете эту переменную другой, она будет также указывать на этот адрес
Например,
a = []
a.object_id # 70220203482480
b = a
b.object_id # 70220203482480
Когда вы добавляете новый элемент, это означает, что вы добавляете значение в массив, который инициализирован в памяти, вызовы a
и b
оба покажут этот массив с новым элементом.
a.push(1)
b # [1]
Давайте посмотрим на второй пример
c = 'reference'
d = c
c.object_id #70220203442960
d.object_id #70220203442960
c.capitalize! # 'Reference'
d # 'Reference'
Если вы назначите d = 'new object'
, Ruby создаст другой объект в памяти и присвоит ему значение в виде строки new object
, а затем d
будет указывать на этот новый адрес памяти
d = 'new object'
d.object_id # 70220203334840 (different one)
c # 'Reference' (cause c still point to the last object in memory)