Я не уверен в значении «... но не объекты, которые они ссылаются» как в документе, оформленном ruby
, так и rubinus
.Как понять, что #dup и #clone работают с объектами, ссылающимися на другие объекты?
В ruby-doc, есть объяснение #clone
и #dup
поведения говорят:
Производит неполную копию OBJ-переменные экземпляра OBJ будут скопированы, но не объекты, на которые они ссылаются. Копирует замороженное и испорченное состояние объекта. См. Также обсуждение в разделе Объект # 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
Я думаю, что второй 's1.a.object_id # => 7344240' должен быть' s2.a.object_id'. Все они ссылаются на один и тот же объект массива. – steveyang
Итак, «... не рекурсивно копирует объекты, которые они ссылаются."означает, только скопировать референт (указатель), а не ссылку, не так ли? – steveyang
@ steven.yang: Whoopss! Спасибо. – Linuxios