web-dev-qa-db-fra.com

Ajouter une paire clé / valeur au hachage avec << in Ruby

En Ruby, on peut ajouter des valeurs aux tableaux existants en utilisant <<:

a = []
a << "foo"

mais pouvez-vous également ajouter des paires clé/valeur à un hachage existant?

h = {}
h << :key "bar"

Je sais que tu peux faire:

h[:key] = ""
h[:key] << "bar"

mais ce n'est pas ce que je veux.

Merci.

71
jcarpio

Il y a merge! .

_h = {}
h.merge!(key: "bar")
# => {:key=>"bar"}
_
127
sawa

Comme les hachages ne sont pas ordonnés de manière inhérente, il n’ya pas de notion d’ajout. Ruby Les hachages depuis la version 1.9 conservent toutefois l'ordre d'insertion. Voici les moyens d'ajouter de nouvelles paires clé/valeur.

La solution la plus simple est

h[:key] = "bar"

Si vous voulez une méthode, utilisez store:

h.store(:key, "bar")

Si vous voulez vraiment, vraiment utiliser un opérateur "shovel" (<<), il ajoute en fait à la valeur du hachage sous forme de tableau et vous devez spécifier la clé:

h[:key] << "bar"

Ce qui précède ne fonctionne que lorsque la clé existe. Pour ajouter une nouvelle clé, vous devez initialiser le hachage avec une valeur par défaut, ce que vous pouvez faire comme ceci:

h = Hash.new {|h, k| h[k] = ''}
h[:key] << "bar"

Vous pouvez être tenté de corriger Hache avec un singe pour inclure un opérateur de pelle qui fonctionne comme vous l'avez écrit:

class Hash
  def <<(k,v)
    self.store(k,v)
  end
end

Cependant, cela n’hérite pas du "sucre syntaxique" appliqué à l’opérateur de pelletage dans d’autres contextes:

h << :key, "bar" #doesn't work
h.<< :key, "bar" #works
74
Mark Thomas

Non, je ne pense pas que vous puissiez ajouter des paires clé/valeur. La seule chose la plus proche que je connaisse utilise la méthode store:

h = {}
h.store("key", "value")
25
PericlesTheo

Peut-être que vous voulez Hash # fusion?

1.9.3p194 :015 > h={}
 => {} 
1.9.3p194 :016 > h.merge(:key => 'bar')
 => {:key=>"bar"} 
1.9.3p194 :017 > 

Si vous voulez changer le tableau en place, utilisez merge!

1.9.3p194 :016 > h.merge!(:key => 'bar')
 => {:key=>"bar"} 
3
Michael Durrant

De la même manière, merge! et store traitent les hachages existants différemment en fonction du nom de clé et affecteront donc vos préférences. Hormis cela du point de vue de la syntaxe, la syntaxe de merge!key: "value" est très proche de JavaScript et de Python. J'ai toujours détesté les paires clé-valeur séparant les virgules, personnellement.

hash = {}
hash.merge!(key: "value")
hash.merge!(:key => "value")
puts hash

{:key=>"value"}

hash = {}
hash.store(:key, "value")
hash.store("key", "value")
puts hash

{:key=>"value", "key"=>"value"}

Pour que l'opérateur de pelle << fonctionne, je vous conseillerais d'utiliser la réponse de Mark Thomas .

1
kayleeFrye_onDeck

Je devais faire la même chose mais je devais ajouter des valeurs avec les mêmes clés. Lorsque j'utilise la fusion ou la mise à jour, je ne peux pas transmettre les valeurs avec les mêmes clés. J'ai donc dû utiliser un tableau de hachages.

    my_hash_static = {:header =>{:company => 'xx', :usercode => 'xx', :password => 'xx',
                      :type=> 'n:n', :msgheader => from}, :body=>[]}
    my_hash_dynamic = {:mp=>{:msg=>message, :no=>phones} }        
    my_hash_full = my_hash_static[:body].Push my_hash_dynamic
1
Caner Çakmak