Hashes imbriqués
Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 35 sur 56.
Une valeur de hash peut elle-même être un hash. Cette forme imbriquée est la manière dont le code Ruby représente généralement des enregistrements structurés, un seul hash indexé par id (ou nom), où chaque valeur porte ses propres champs :
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}Pour accéder à une valeur imbriquée, enchaînez les recherches :
puts students["Alice"][:age] # 20
puts students["Bob"][:grade] # BL'ajout d'un nouveau champ à l'un des hachages 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é à partir d'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 fourni : chaque clé de premier niveau est un département, chaque clé interne est un article, et chaque valeur interne est la quantité en stock (un entier).
Lisez une ligne d'entrée : une liste séparée par des virgules de chemins de recherche department/item.
Pour chaque chemin, dans l'ordre, utilisez dig pour le résoudre. Affichez soit :
<department>/<item>: <qty>lorsque le chemin existe<department>/<item>: missinglorsquedigretournenil
Après avoir affiché chaque ligne, affichez également une ligne de résumé :
Total inventory: <sum>Le total est la somme de chaque quantité à travers chaque département dans le hash d'origine. Utilisez une itération imbriquée (chaque département, puis chaque article).
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: 39Aide-mémoire
Les hashs imbriqués stockent des hashs comme valeurs à l'intérieur d'un autre hash :
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}Enchaînez les recherches pour accéder aux valeurs imbriquées :
students["Alice"][:age] # 20Utilisez l'affectation pour ajouter ou mettre à jour un champ imbriqué :
students["Alice"][:major] = "Math"Utilisez dig pour parcourir en toute sécurité les clés imbriquées — renvoie nil si une clé est manquante :
students.dig("Alice", :grade) # "A"
students.dig("Cara", :grade) # nilEssayez 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 recherche, creuser et afficher la qté ou 'missing'.
# Ensuite, afficher 'Total inventory: <somme>' pour tous les articles.
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 - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline