Reduce / Inject
Teil des Abschnitts Logik und Ablauf 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 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 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