Raku-Kurs / Anhang 🆕 / Ablauf und Funktionen / Subroutinen und funktionaler Stil / Exercises / Ein laufender Akkumulator
Lösung: Ein laufender Akkumulator
Hier ist eine mögliche Lösung der Aufgabe.
Code
sub make-accumulator($start) {
my $total = $start;
return -> $amount { $total += $amount };
}
my $acc = make-accumulator(100);
say $acc(10);
say $acc(25);
say $acc(-5);🦋 Du findest den Quellcode in der Datei accumulator.raku.
Ausgabe
110
135
130Kommentare
Der gelieferte Block schließt über
$total: Diese Variable lebt zwischen den Aufrufen weiter, jeder Aufruf erinnert sich also an die Summe des vorigen.$total += $amounterneuert die laufende Summe und liefert sie zugleich, und das ist es, was jedessayausgibt:110, dann135, dann130.Eine Alternative hält die Summe im Block selbst, in einer
state-Variablen. Anders als ein gewöhnlichesmywird einestate-Variable nur einmal initialisiert — beim ersten Lauf des Blocks — und behält ihren Wert dann über spätere Aufrufe hinweg:sub make-accumulator($start) { return -> $amount { state $total = $start; $total += $amount }; } my $acc = make-accumulator(100); say $acc(10); say $acc(25); say $acc(-5);
Jeder Aufruf von
make-accumulatorerzeugt einen frischen Block mit seinem eigenenstate $total, getrennte Sammler bleiben also unabhängig — und die Closure über$startversorgt jeden weiterhin mit seinem eigenen Anfangswert.