E 'vero che clone
copia il frozen
stato di un oggetto, mentre dup
non lo fa:
o = Object.new
o.freeze
o.clone.frozen?
#=> true
o.dup.frozen?
#=> false
clone
copierà anche i metodi singleton dell'oggetto mentre dup
non:
o = Object.new
def o.foo
42
end
o.clone.respond_to?(:foo)
#=> true
o.dup.respond_to?(:foo)
#=> false
Il che mi porta a supporre che il numero clone
venga talvolta interpretato come una copia "più profonda" rispetto a dup
. Ecco alcune citazioni sul tema:
Comment on ActiveRecord::Base#initialize_dup
from Rails 3:
oggetti ingannati hanno alcun ID assegnato e vengono trattati come nuovi record. Nota: questa è una copia "superficiale" poiché copia solo gli attributi dell'oggetto , non le sue associazioni. L'estensione di una copia "profonda" è l'applicazione specifica ed è quindi lasciata all'applicazione da implementare in base a in base alle proprie necessità.
An article about deep copies in Ruby:
c'è un altro metodo degno di nota, clone
. Il metodo clone
fa la stessa cosa di dup
con un'importante distinzione: è previsto che gli oggetti sovrascrivano questo metodo con uno che può eseguire copie profonde.
But then again, theres deep_dup
in Rails 4:
Restituisce una copia completa di oggetto se è duplicabile. Se non è duplicabile, restituisce self
.
and also ActiveRecord::Core#dup
and #clone
in Rails 4:
clone
- Identico al metodo clone di Ruby. Questa è una copia "superficiale". Tieni presente che i tuoi attributi non vengono copiati. [...] Se è necessaria una copia dell'hash hash, utilizzare il metodo #dup
.
Ciò significa che in questo caso la parola dup
viene utilizzata per riferirsi nuovamente a un clone profondo. Per quanto posso vedere, sembra non esserci consenso nella comunità, tranne che si dovrebbe usare clone
e dup
nel caso in cui si abbia bisogno di uno specifico effetto collaterale di uno dei due.
Infine, vedo dup
molto più spesso in codice Ruby di clone
. Non ho mai usato lo clone
finora, e lo farò solo quando ne avrò bisogno esplicitamente.
Possibile duplicato di [Qual è la differenza tra i metodi dup e clone di Ruby?] (Http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak