Reduce / Inject
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 23 von 56.
Manchmal müssen Sie ein gesamtes Array auf einen einzelnen Wert reduzieren, eine Summe, ein Produkt, einen längsten String. reduce (auch inject genannt: dieselbe Methode, zwei Namen) ist das Werkzeug dafür.
Der Block nimmt zwei Parameter entgegen: den Akkumulator und das aktuelle Element. Der Rückgabewert des Blocks wird zum nächsten Akkumulator.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10Schritt für Schritt ist der Akkumulator 0 → 1 → 3 → 6 → 10.
Das erste Argument ist der Startwert des Akkumulators. Wenn Sie es weglassen, verwendet Ruby das erste Element des Arrays:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Für reine Operationen wie Summe und Produkt bietet Ruby eine Abkürzung: Übergeben Sie ein Symbol anstelle eines Blocks:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Sobald Sie einen benutzerdefinierten Akkumulator erstellen können, können Sie fast alles in einem Durchgang berechnen.
Aufgabe
EinfachLies eine durch Kommas getrennte Liste von Ganzzahlen ein. Gib drei Zeilen aus:
- Die Summe (verwende
reduce(:+)) - Das Produkt (verwende
reduce(:*)) - Das Maximum, berechnet mit
reduceund einem expliziten Block, nicht unter Verwendung vonmax.
Für die Eingabe 2,5,3,8 ist die Ausgabe:
18
240
8Probier es selbst
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: Summe, Produkt und Maximum ausgeben (mit reduce + explizitem Block)
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 Iterator2Bereiche
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