Menu
Coddy logo textTech

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]    # B

L'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)   # nil
challenge icon

Défi

Moyen

Un 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>: missing lorsque dig retourne nil

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: 39

Aide-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]    # 20

Utilisez 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)   # nil

Essayez 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.
quiz iconTestez-vous

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