Zusammenführen und Transformieren
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 36 von 56.
Zwei Operationen kommen bei der Arbeit mit Hashes so oft vor, dass Ruby ihnen eigene Methoden gibt.
merge kombiniert zwei Hashes zu einem neuen. Wenn beide denselben Schlüssel haben, gewinnt der Wert auf der rechten Seite:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Keines der Originale wird verändert, merge gibt einen neuen Hash zurück.
transform_values erstellt einen neuen Hash mit denselben Schlüsseln, wobei jedoch jeder Wert durch einen Block verarbeitet wird:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}Und transform_keys macht dasselbe für Schlüssel, nützlich beim Konvertieren von Strings in Symbole oder beim Normalisieren der Groß-/Kleinschreibung:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Aufgabe
MittelZwei Warenkorb-Hashes sind gegeben: monday und tuesday; jeder ordnet einem Zeichenketten-Artikelnamen eine ganzzahlige Menge zu. Der Shop möchte eine normalisierte Gesamtsumme für zwei Tage.
Erzeuge einen einzigen finalen Hash, indem du:
- die beiden Hashes
merge-st, mit einem Block, sodass Schlüssel, die in beiden vorkommen, ihre Mengen summiert erhalten (nicht überschrieben werden) - auf das Ergebnis
transform_keys(&:to_sym)anwendest, sodass die Schlüssel zu Symbolen werden transform_valuesverwendest, um einen Mengenrabatt von 10 % anzuwenden: Jede Menge wird zu(qty * 9 / 10), wobei Ganzzahlarithmetik verwendet wird
Gib den finalen Hash mit inspect aus.
Für die Standarddaten lautet die Ausgabe:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Äpfel: 5 + 5 = 10, dann 9. Brot: 3 + 2 = 5, dann 4. Milch: 6 nur am Montag → 5. Käse: 2 nur am Dienstag → 1.)
Probier es selbst
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: merge-with-block, um überlappende Schlüssel zu summieren, dann Schlüssel symbolisieren,
# dann * 9 / 10 auf jeden Wert anwenden, dann inspect
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