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] # BDas 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) # nilAufgabe
MittelEin 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, wenndigden Wertnilzurü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: 39Spickzettel
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] # 20Zuweisen, 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) # nilProbier 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.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer