prawdą jest, że clone
kopiuje stan obiektu frozen
, natomiast dup
nie:
o = Object.new
o.freeze
o.clone.frozen?
#=> true
o.dup.frozen?
#=> false
clone
będzie również kopiować metody singleton obiektu, gdy dup
nie:
o = Object.new
def o.foo
42
end
o.clone.respond_to?(:foo)
#=> true
o.dup.respond_to?(:foo)
#=> false
Co prowadzi mnie do założenia, że clone
jest czasami rozumiane jako zapewniające "głębszą" kopię niż dup
. Oto kilka cytatów o temacie:
Comment on ActiveRecord::Base#initialize_dup
from Rails 3:
padli ofiarą oszustwa obiekty nie mają ID przypisane i są traktowane jako nowe rekordy. Uwaga: , że jest to "płytka" kopia, ponieważ kopiuje tylko atrybuty obiektu , a nie jej powiązania. Zakres "głębokiej" kopii jest konkretny i dlatego jest pozostawiony aplikacji, aby zaimplementować zgodnie z jej potrzebą, zgodnie z .
An article about deep copies in Ruby:
Jest jeszcze inna metoda Warto wspomnieć, clone
. Metoda clone
robi to samo co dup
z jednym ważnym rozróżnieniem: oczekuje się, że obiekty zastąpią tę metodę tą, która może wykonywać głębokie kopie.
But then again, theres deep_dup
in Rails 4:
Zwraca głęboką kopię obiektu jeśli to duplicable. Jeśli nie można go powielić, zwraca self
.
and also ActiveRecord::Core#dup
and #clone
in Rails 4:
clone
- Identyczna jak metoda clone Ruby. To jest "płytka" kopia. Ostrzegaj, że twoje atrybuty nie są kopiowane. [...] Jeśli potrzebujesz kopii atrybutu atrybutów, użyj metody #dup
.
Co oznacza, że tutaj słowo dup
jest używane do ponownego oznaczenia głębokiego klonu. O ile widzę, wydaje się, że nie ma konsensusu w społeczności, z wyjątkiem tego, że powinieneś używać clone
i dup
w przypadku, gdy potrzebujesz określonego efektu ubocznego jednego z nich.
Wreszcie, widzę dup
znacznie częściej w kodzie Ruby niż clone
. Nigdy dotąd nie używałem clone
i nie będę tego robić, dopóki nie będę tego wyraźnie potrzebował.
Możliwy duplikat [Jaka jest różnica między dupą Rubiego a metodami klonowania?] (Http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak