web-dev-qa-db-fra.com

Ruby: Quelle est la méthode la plus simple pour mettre à jour les valeurs de hachage?

Dire:

h = { 1 => 10, 2 => 20, 5 => 70, 8 => 90, 4 => 34 }

Je voudrais changer chaque valeur v en foo(v), tel que h sera:

h = { 1 => foo(10), 2 => foo(20), 5 => foo(70), 8 => foo(90), 4 => foo(34) }

Quelle est la manière la plus élégante d'y parvenir?

44
Misha Moroshko

Vous pouvez utiliser update (alias de merge!) pour mettre à jour chaque valeur à l'aide d'un bloc:

hash.update(hash) { |key, value| value * 2 }

Notez que nous fusionnons effectivement hash avec lui-même. Cela est nécessaire car Ruby appellera le bloc pour résoudre la fusion pour toutes les clés qui entrent en collision, en définissant la valeur avec la valeur de retour du bloc.

104
Gareve

Rails ajouté transform_values(), vous pouvez donc maintenant faire {a:1, b:2, c:3}.transform_values{|v| foo(v)}

http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values

13
MaximusDominus

Cela fera:

h.each {|k, v| h[k] = foo(v)}
7
rubyprince

Ce qui suit est légèrement plus rapide que @Dan Cheail pour les grands hachages, et est un style de programmation légèrement plus fonctionnel:

new_hash = Hash[old_hash.map {|key, value| key, foo(value)}]

Hash#map crée un tableau de paires de valeurs clés, et Hash.[] convertit le tableau de paires en un hachage.

5
Andrew Grimm

Il y a deux façons de le faire; la manière la plus simple serait d'utiliser Hash#each pour mettre à jour un nouveau hachage:

new_hash = {}
old_hash.each do |key, value|
  new_hash[key] = foo(value)
end
0
Dan Cheail