Cursus Raku / Addendum 🆕 / Verloop en functies / Subroutines en functionele stijl / Exercises / Een lopende accumulator
Oplossing: Een lopende accumulator
Hier is een mogelijke oplossing voor de taak.
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);🦋 Je kunt de broncode vinden in het bestand accumulator.raku.
Uitvoer
110
135
130Opmerkingen
Het teruggegeven blok sluit om
$totalheen: die variabele blijft tussen aanroepen bestaan, dus onthoudt elke aanroep de som van de vorige.$total += $amountwerkt zowel de lopende som bij als geeft haar terug, en dat is wat elkesayafdrukt:110, dan135, dan130.Een alternatief houdt de som binnen het blok zelf, in een
state-variabele. Anders dan een gewonemywordt eenstate-variabele slechts één keer geïnitialiseerd — de eerste keer dat het blok draait — en houdt ze daarna haar waarde over latere aanroepen heen: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);
Elke aanroep van
make-accumulatorlevert een vers blok met een eigenstate $totalop, dus blijven aparte accumulators onafhankelijk — en de closure om$startgeeft elk nog steeds zijn eigen beginwaarde.