Es cierto que clone
copia el estado de un objeto frozen
, mientras dup
no:
o = Object.new
o.freeze
o.clone.frozen?
#=> true
o.dup.frozen?
#=> false
clone
también copiará los métodos singleton del objeto, mientras que dup
no:
o = Object.new
def o.foo
42
end
o.clone.respond_to?(:foo)
#=> true
o.dup.respond_to?(:foo)
#=> false
que me lleva a la suposición de que clone
se entiende a veces como para proporcionar una copia "profundo" que dup
. Aquí hay algunas citas sobre el tema:
Comment on ActiveRecord::Base#initialize_dup
from Rails 3:
objetos engañados han asignado ningún id y se tratan como nuevos registros. Tenga en cuenta que esta es una copia "poco profunda" ya que copia los atributos del objeto solamente, no sus asociaciones. La extensión de una copia "profunda" es específica de la aplicación y, por lo tanto, se deja a la aplicación implementar de acuerdo con a su necesidad.
An article about deep copies in Ruby:
Hay otro método vale la pena mencionar, clone
. El método clone
hace lo mismo que dup
con una distinción importante: se espera que los objetos anulen este método con uno que pueda hacer copias en profundidad.
But then again, theres deep_dup
in Rails 4:
Devuelve una copia profunda de objeto si es duplicable. Si no es duplicable, devuelve self
.
and also ActiveRecord::Core#dup
and #clone
in Rails 4:
clone
- Idéntico al método clone de Ruby. Esta es una copia "superficial". Tenga en cuenta que sus atributos no se copian. [...] Si necesita una copia de sus atributos hash, use el método #dup
.
Lo que significa que aquí, la palabra dup
se utiliza para referirse a un clon de profundidad de nuevo. Por lo que puedo ver, parece que no hay consenso en la comunidad, excepto que debe usar clone
y dup
en el caso cuando necesite un efecto secundario específico de cualquiera de los dos.
Finalmente, veo dup
con mucha más frecuencia en el código de Ruby que clone
. Nunca he usado clone
hasta ahora, y no lo haré hasta que explícitamente lo necesite.
Posible duplicado de [¿Cuál es la diferencia entre los métodos de Duplicación y clonación de Ruby?] (Http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak