Menu
Coddy logo textTech

Verschachtelte Hashes

Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 35 von 56.

Ein Hash-Wert kann selbst ein Hash sein. Diese verschachtelte Form ist die Art und Weise, wie Ruby-Code typischerweise strukturierte Datensätze darstellt: ein einzelner Hash, der nach ID (oder Name) indiziert ist, wobei jeder Wert seine eigenen Felder enthält:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

Um auf einen verschachtelten Wert zuzugreifen, verkette die Abfragen:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

Das Hinzufügen eines neuen Feldes zu einem der inneren Hashes funktioniert auf die gleiche Weise:

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

Um sicher aus einem verschachtelten Hash zu lesen, bei dem ein Schlüssel auf einer beliebigen Ebene fehlen könnte, durchläuft dig die Kette und gibt nil zurück, falls unterwegs etwas fehlt:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

Aufgabe

Mittel

Ein verschachtelter inventory Hash ist gegeben: Jeder Schlüssel der obersten Ebene ist eine Abteilung (Department), jeder innere Schlüssel ein Artikel (Item) und jeder innere Wert die gelagerte Menge (eine Ganzzahl).

Lies eine Zeile als Eingabe ein: eine durch Kommas getrennte Liste von department/item Suchpfaden.

Verwende für jeden Pfad in der angegebenen Reihenfolge dig, um ihn aufzulösen. Gib entweder Folgendes aus:

  • <department>/<item>: <qty>, wenn der Pfad existiert
  • <department>/<item>: missing, wenn dig den Wert nil zurückgibt

Nachdem jede Zeile ausgegeben wurde, gib zusätzlich eine Zusammenfassungszeile aus:

Total inventory: <sum>

Die Gesamtsumme ist die Summe jeder Menge über alle Abteilungen im ursprünglichen Hash hinweg. Verwende eine verschachtelte Iteration (jede Abteilung, dann jeder Artikel).

Für die Eingabe fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk lautet die Ausgabe:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

Spickzettel

Verschachtelte Hashes speichern Hashes als Werte innerhalb eines anderen Hashes:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

Verketten Sie Lookups, um auf verschachtelte Werte zuzugreifen:

students["Alice"][:age]    # 20

Zuweisen, um ein verschachteltes Feld hinzuzufügen oder zu aktualisieren:

students["Alice"][:major] = "Math"

Verwenden Sie dig, um verschachtelte Schlüssel sicher zu durchlaufen — gibt nil zurück, wenn ein Schlüssel fehlt:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil

Probier es selbst

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# TODO: Für jede Suche, dig anwenden und Menge oder 'missing' ausgeben.
#       Anschließend 'Total inventory: <sum>' über alle Artikel hinweg ausgeben.
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss