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?
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.
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
Cela fera:
h.each {|k, v| h[k] = foo(v)}
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.
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