Le clone profond automatique n'est pas toujours ce que l'on souhaite. Il est souvent nécessaire de définir quelques attributs sélectionnés pour le clonage profond. Une façon flexible de le faire est d'implémenter la fonction initialize_copy
, initialize_dup
et initialize_clone
méthodes.
Si vous avez une classe :
class Foo
attr_accessor :a, :b
end
et vous ne voulez que le clone profond :b
vous remplacez le initialize_*
méthode :
class Foo
attr_accessor :a, :b
def initialize_dup(source)
@b = @b.dup
super
end
end
Bien sûr, si vous voulez @b
pour cloner profondément certains de ses propres attributs, vous faites de même dans la classe de b.
Rails le fait (voir https://github.com/rails/rails/blob/0951306ca5edbaec10edf3440d5ba11062a4f2e5/activemodel/lib/active_model/errors.rb#L78 )
Pour une explication plus complète, je l'ai appris ici à partir de ce post https://aaronlasseigne.com/2014/07/20/know-ruby-clone-and-dup/