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

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

Défi

Moyen

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

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

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 lookup, dig et imprimer qty ou 'missing'.
#       Then print 'Total inventory: <sum>' across all items.
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

Entraînez-vous par vous-même : Compilateur Ruby en ligne