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 Struktur stellt strukturierte Datensätze in Ruby-Code typischerweise dar: ein einzelner Hash, der nach id (oder name) verschlüsselt ist und bei dem 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 dieselbe Weise:
students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}Um sicher aus einem verschachtelten Hash zu lesen, dem auf jeder Ebene ein Schlüssel fehlen könnte, durchläuft dig die Kette und gibt nil zurück, wenn irgendwo auf dem Weg 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, jeder innere Schlüssel ein Artikel und jeder innere Wert die vorrätige Menge (eine Ganzzahl).
Lies eine Eingabezeile 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, wenndignilzurückgibt
Gib nach jeder ausgegebenen Zeile 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: 39Probier 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 jeden Lookup diggen und qty oder 'missing' ausgeben.
# Then print 'Total inventory: <sum>' across all items.
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
Überblick über String-MethodenString-InterpolationStrings durchlaufenSplitten und VerbindenRückblick – String Weaver4Blocks, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas Schlüsselwort yieldBlock-ParameterProcs und LambdasRückblick – Benutzerdefinierter Iterator7Hashes Teil 2
Hash.new mit StandardwertenHashes durchlaufenVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler2Bereiche
Was ist ein Bereich?BereichsmethodenBereiche in Case / WhenWiederholung – Übung zu Bereichen5Das Enumerable-Kraftpaket
Select und RejectMap verkettenReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Datenpipeline8Fortgeschrittene Entscheidungsfindung
Case mit Klassen & Regexwhen mit mehreren WertenTernärer OperatorInline-if / unlessRückblick – NotenklassifiziererÜbe selbstständig: Online-Ruby-Compiler