web-dev-qa-db-fra.com

Comment ajouter à un hachage existant dans Ruby

En ce qui concerne l'ajout d'une paire key => value à un hachage déjà rempli en Ruby, je suis en train de travailler sur Apress 'Beginning Ruby et je viens de terminer le chapitre sur le hachage.

J'essaie de trouver le moyen le plus simple d'obtenir les mêmes résultats avec les hachages qu'avec les tableaux:

x = [1, 2, 3, 4]
x << 5
p x
93
Tom

Si vous avez un hash, vous pouvez y ajouter des éléments en les référençant par la clé:

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

Ici, comme [ ] crée un tableau vide, { } créera un hachage vide.

Les tableaux ont zéro ou plusieurs éléments dans un ordre spécifique, où les éléments peuvent être dupliqués. Les hachages ont zéro ou plusieurs éléments organisés par clé, où les clés ne peuvent pas être dupliquées mais les valeurs stockées dans ces positions peuvent l'être.

Les hachages dans Ruby sont très flexibles et peuvent avoir des clés de presque tout type. Cela le rend différent des structures de dictionnaire que vous trouvez dans d'autres langues.

Il est important de garder à l'esprit que la nature spécifique d'une clé de hachage est souvent importante:

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails complique quelque peu la situation en fournissant HashWithIndifferentAccess où il convertira librement entre les méthodes d'adressage Symbol et String.

Vous pouvez également indexer sur presque tout, y compris les classes, les nombres et d'autres hachages.

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Les hachages peuvent être convertis en tableaux et inversement:

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

Lorsqu'il s'agit d'insérer des éléments dans un hachage, vous pouvez le faire l'un après l'autre ou utiliser la méthode merge pour combiner les hachages:

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

Notez que cela ne modifie pas le hachage d'origine, mais en retourne un nouveau. Si vous souhaitez combiner un hachage dans un autre, vous pouvez utiliser la méthode merge!:

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

Comme beaucoup de méthodes sur String et Array, le ! indique qu'il s'agit d'une opération sur place.

179
tadman
my_hash = {:a => 5}
my_hash[:key] = "value"
64
robbrit

Si vous souhaitez en ajouter plusieurs:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash
33
Josh Kovach
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x
8
Jeremy Roman
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

Renvoie la valeur fusionnée.

hash
 => {:a=>"a", :b=>"b"} 

Mais ne modifie pas l'objet appelant

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

La réaffectation fait l'affaire.

1
Raam
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

Vous pouvez obtenir votre clé et votre valeur à partir d'une entrée utilisateur. Vous pouvez donc utiliser Ruby . To_sym pouvez convertir une chaîne en symbole, et . To_i convertir une chaîne en un entier.
Par exemple:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.
0
ark1980