Fusionner et transformer
Fait partie de la section Logique et Flux du Journey Ruby de Coddy. Leçon 36 sur 56.
Deux opérations reviennent si souvent lorsqu'on travaille avec des hashs que Ruby leur donne leurs propres méthodes.
merge combine deux hashs en un nouveau. Lorsque les deux ont la même clé, la valeur de droite l'emporte :
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Aucun des originaux n'est modifié, merge retourne un nouveau hash.
transform_values construit un nouveau hash avec les mêmes clés, mais chaque valeur est passée à travers un bloc :
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}Et transform_keys fait la même chose pour les clés, ce qui est utile lors de la conversion de chaînes de caractères en symboles, ou pour normaliser la casse :
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Défi
MoyenDeux hachages de panier sont fournis : monday et tuesday, chacun associant un nom d’article sous forme de chaîne à une quantité entière. La boutique souhaite obtenir un total normalisé sur deux jours.
Produisez un hachage final en :
- fusionnant les deux hachages avec un bloc grâce à
merge, afin que les clés présentes dans les deux hachages aient leurs quantités additionnées (et non remplacées) - appliquant
transform_keys(&:to_sym)au résultat, afin que les clés deviennent des symboles - appliquant
transform_valuespour appliquer une remise de 10 % sur les achats en gros : chaque quantité devient(qty * 9 / 10)en utilisant l’arithmétique entière
Affichez le hachage final avec inspect.
Pour les données par défaut, la sortie est :
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Pommes : 5 + 5 = 10, puis 9. Pain : 3 + 2 = 5, puis 4. Lait : 6 uniquement le lundi → 5. Fromage : 2 uniquement le mardi → 1.)
Essayez vous-même
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: merge-with-block pour additionner les clés qui se chevauchent, puis symboliser les clés,
# puis appliquer * 9 / 10 à chaque valeur, puis inspecter
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - Tisseur de chaînes4Blocs, Procs et Lambdas
Qu'est-ce qu'un bloc ?do..end ou accoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes, 2e partie
Hash.new avec valeurs par défautParcourir les hashesHashes imbriquésFusionner et transformerRécapitulatif - Compteur de fréquences10Projet - Dossiers des étudiants
Présentation du projetAjouter un étudiant2Plages
Qu’est-ce qu’une plage ?Méthodes des plagesPlages dans Case / WhenRécapitulatif - Exercices sur les plages5Puissance des Enumerable
Select et RejectChaînage de MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Pipeline de donnéesEntraînez-vous par vous-même : Compilateur Ruby en ligne