Menu
Coddy logo textTech

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}
challenge icon

Aufgabe

Mittel

Zwei 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:

  1. die beiden Hashes merge-st, mit einem Block, sodass Schlüssel, die in beiden vorkommen, ihre Mengen summiert erhalten (nicht überschrieben werden)
  2. auf das Ergebnis transform_keys(&:to_sym) anwendest, sodass die Schlüssel zu Symbolen werden
  3. transform_values verwendest, 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
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

Übe selbstständig: Online-Ruby-Compiler