Hashes imbriqués
Fait partie de la section Logique et Flux du Journey Ruby de Coddy. Leçon 35 sur 56.
Une valeur de hachage peut elle-même être une hachage. Cette structure imbriquée est la manière dont le code Ruby représente généralement les enregistrements structurés : un seul hachage indexé par un identifiant (ou un nom), où chaque valeur contient ses propres champs :
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}Pour accéder à une valeur imbriquée, enchaîne les recherches :
puts students["Alice"][:age] # 20
puts students["Bob"][:grade] # BAjouter un nouveau champ à l’un des hash internes fonctionne de la même manière :
students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}Pour lire en toute sécurité dans un hash imbriqué auquel il pourrait manquer une clé à n’importe quel niveau, dig parcourt la chaîne et renvoie nil si un élément manque en cours de route :
students.dig("Alice", :grade) # "A"
students.dig("Cara", :grade) # nilDéfi
MoyenUn hash inventory imbriqué est donné : chaque clé de niveau supérieur est un département, chaque clé interne un élément, et chaque valeur interne la quantité en stock (un entier).
Lis une ligne d’entrée : une liste de chemins de recherche department/item séparés par des virgules.
Pour chaque chemin, dans l’ordre, utilise dig pour le résoudre. Affiche soit :
<department>/<item>: <qty>lorsque le chemin existe<department>/<item>: missinglorsquedigrenvoienil
Après avoir affiché chaque ligne, affiche également une ligne récapitulative :
Total inventory: <sum>Le total est la somme de toutes les quantités dans chaque département du hash original. Utilise une itération imbriquée (chaque département, puis chaque élément).
Pour l’entrée fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk, la sortie est :
fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39Essayez vous-même
inventory = {
fruits: { apples: 12, bananas: 4 },
meat: { beef: 7, chicken: 5 },
dairy: { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")
# TODO: pour chaque lookup, dig et imprimer qty ou 'missing'.
# Then print 'Total inventory: <sum>' across all items.
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