Verschachtelte Hashes
Teil des Abschnitts Logik und Ablauf 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 und Ablauf
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