Copiar objetos que tienen otros objetos

Hola

Como ya sabréis, en Ruby la asignación de objetos no es una copia, sino
una referencia. Es decir, que nos podemos encotnrar cosas como esta:

irb(main):001:0> people1 = {“name” => “Steve”}
=> {“name”=>“Steve”}
irb(main):002:0> people2 = people1
=> {“name”=>“Steve”}
irb(main):003:0> people2[“name”] = “Cat”
=> “Cat”
irb(main):004:0> people1[“name”]
=> “Cat”

Esto se soluciona usando el metodo clone. Es decir, people2=
people1.clone

El problema que tengo es que si el objeto tiene a su vez otros objetos,
estos no se duplican y sigo teniendo el problema del codigo mostrado
arriba (es decir, que si modifico un objeto en un objeto, este se
modifica también en los otros). Es un poco frustrante, hay alguna forma
de hacer que se clone absolutamente todo, incluidos los objetos
internos?

Un saludo,

Víctor

Victor M. wrote:

Hola

Como ya sabréis, en Ruby la asignación de objetos no es una copia, sino
una referencia. Es decir, que nos podemos encotnrar cosas como esta:

irb(main):001:0> people1 = {“name” => “Steve”}
=> {“name”=>“Steve”}
irb(main):002:0> people2 = people1
=> {“name”=>“Steve”}
irb(main):003:0> people2[“name”] = “Cat”
=> “Cat”
irb(main):004:0> people1[“name”]
=> “Cat”

Esto se soluciona usando el metodo clone. Es decir, people2=
people1.clone

El problema que tengo es que si el objeto tiene a su vez otros objetos,
estos no se duplican y sigo teniendo el problema del codigo mostrado
arriba (es decir, que si modifico un objeto en un objeto, este se
modifica también en los otros). Es un poco frustrante, hay alguna forma
de hacer que se clone absolutamente todo, incluidos los objetos
internos?

Un saludo,

Víctor

Bueno, he encontrado una solución:

class Object
def deep_clone
# Abracadabra !!!
Marshal::load(Marshal::dump(self))
end
end

Lo he encontrado aqui:

Parece que funciona :slight_smile: