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
8Spickzettel
reduce (Alias: inject) reduziert ein Array auf einen einzelnen Wert. Der Block erhält einen Akkumulator und das aktuelle Element; sein Rückgabewert wird zum nächsten Akkumulator.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n } # 10Lassen Sie den Startwert weg, um das erste Element als initialen Akkumulator zu verwenden:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Übergeben Sie ein Symbol als Abkürzung für einfache Operationen:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Probier 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
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer