Ruby Language Modification des clés et des valeurs


Exemple

Vous pouvez créer un nouveau hachage avec les clés ou les valeurs modifiées, vous pouvez également ajouter ou supprimer des clés en utilisant inject (AKA, réduire ). Par exemple, pour produire un hachage avec des clés et des valeurs majuscules:

fruit = { name: 'apple', color: 'green', shape: 'round' }
# => {:name=>"apple", :color=>"green", :shape=>"round"}

new_fruit = fruit.inject({}) { |memo, (k,v)| memo[k.to_s] = v.upcase; memo }

# => new_fruit is {"name"=>"APPLE", "color"=>"GREEN", "shape"=>"ROUND"}

Hash est un enumerable, en substance une collection de paires clé / valeur. Par conséquent, il existe des méthodes telles que each , map et inject .

Pour chaque paire clé / valeur du hachage, le bloc donné est évalué, la valeur de mémo lors de la première exécution est la valeur initiale transmise pour inject , dans notre cas, un hachage vide, {} . La valeur de memo pour les évaluations ultérieures est la valeur renvoyée de l'évaluation des blocs précédents, c'est pourquoi nous modifions le memo en définissant une clé avec une valeur, puis renvoyons le memo à la fin. La valeur de retour de l'évaluation des blocs finaux est la valeur de retour de inject , dans notre memo cas.

Pour éviter d'avoir à fournir la valeur finale, vous pouvez utiliser each_with_object à la place:

new_fruit = fruit.each_with_object({}) { |(k,v), memo| memo[k.to_s] = v.upcase }

Ou même carte :

1.8
new_fruit = Hash[fruit.map{ |k,v| [k.to_s, v.upcase] }]

(Voir cette réponse pour plus de détails, y compris comment manipuler les hachages en place.)