229 votes

Comment copier un hachage en Ruby ?

Je vais vous avouer que je suis un peu un newbie rubis (écriture de scripts de râteau, maintenant). Dans la plupart des langues, les constructeurs de copie sont faciles à trouver. Une demi-heure de la recherche, il n’a pas trouvé en ruby. Je veux créer une copie de la table de hachage afin que je puisse le modifier sans affecter l’instance d’origine.

Certains s’attendaient à des méthodes qui ne fonctionnent pas comme prévu :

En attendant, j’ai eu recours à cette solution de contournement inélégante

257voto

Mark Rushakoff Points 97350

L' clone méthode est de Ruby standard, intégré dans la façon de faire un peu profond, la copie:

irb(main):003:0> h0 = {"John" => "Adams", "Thomas" => "Jefferson"}
=> {"John"=>"Adams", "Thomas"=>"Jefferson"}
irb(main):004:0> h1 = h0.clone
=> {"John"=>"Adams", "Thomas"=>"Jefferson"}
irb(main):005:0> h1["John"] = "Smith"
=> "Smith"
irb(main):006:0> h1
=> {"John"=>"Smith", "Thomas"=>"Jefferson"}
irb(main):007:0> h0
=> {"John"=>"Adams", "Thomas"=>"Jefferson"}

Notez que le comportement peut être remplacée:

Cette méthode peut avoir de la classe de comportement. Si oui, ce comportement sera documentée en vertu de l' #initialize_copy méthode de la classe.

199voto

Wayne Conrad Points 31052

Comme d'autres l'ont souligné, clone va le faire. Sachez que clone de hachage fait une copie superficielle. C'est-à-dire:

h1 = {:a => 'foo'} 
h2 = h1.clone
h1[:a] << 'bar'
p h2                # => {:a=>"foobar"}

Ce qui se passe est que le hachage de références sont en train d'être copié, mais pas les objets que les références se rapportent à l'.

Si vous voulez une copie en profondeur alors:

def deep_copy(o)
  Marshal.load(Marshal.dump(o))
end

h1 = {:a => 'foo'}
h2 = deep_copy(h1)
h1[:a] << 'bar'
p h2                # => {:a=>"foo"}

deep_copy fonctionne pour n'importe quel objet qui peut être mobilisé. La plupart des types de données intégrés (Tableau, Hachage, de la Corde, &c.) peut être muselé.

90voto

lmanners Points 955

Si vous utilisez des rails, vous pouvez faire :

http://apidock.com/rails/Hash/deep_dup

13voto

James Moore Points 3293

Hachage peut créer un nouveau hachage d’un hachage existant :

2voto

Josh Lee Points 53741

Utilisation `` :

(Prêter à confusion, la documentation de dit que est le moyen de la remplacer, mais le lien pour cette méthode dans vous dirige à au lieu de cela...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X