Я не уверен в значении "... но не в объектах, на которые они ссылаются" как в документах ruby
, так и rubinus
.
В ruby-doc есть объяснение #clone
и #dup
поведение, говорящее:
Создает поверхностную копию obj — копируются переменные экземпляра obj, но не объекты, на которые они ссылаются. Копирует замороженное и испорченное состояние объекта obj. См. также обсуждение в разделе Object#dup.
То же самое повторяется в реализации Rubinius:
Копирует переменные экземпляра, но не рекурсивно копирует объекты, на которые они ссылаются. Копирует испорченность.
Я попробовал следующий код, но поведение не соответствует моим ожиданиям.
class Klass
attr_accessor :array
end
s1 = Klass.new
ar = [1, 2, 3]
s1.array = [ar]
s2 = s1.clone
# according to the doc,
# s2.array should be initialized with empty Array
# however the array is recursivley copied too
s2.array.equal? s1.array # true