Kurso de Raku / Aldono 🆕 / Fluo kaj funkcioj / Subprogramoj kaj funkcia stilo / Exercises / Kreskanta akumulilo
Solvo: Kreskanta akumulilo
Jen ebla solvo de la tasko.
Kodo
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);🦋 Vi povas trovi la fontkodon en la dosiero accumulator.raku.
Eligo
110
135
130Komentoj
La redonita bloko fermiĝas ĉirkaŭ
$total: tiu variablo plu vivas inter la vokoj, do ĉiu voko memoras la sumon de la antaŭa.$total += $amountkaj ĝisdatigas la kurantan sumon kaj redonas ĝin, kaj tion ĉiusaypresas:110, poste135, poste130.Alternativo tenas la sumon ene de la bloko mem, en variablo
state. Malsame ol ordinaramy, variablostateestas komencvalorizata nur unufoje — la unuan fojon, kiam la bloko plenumiĝas — kaj poste konservas sian valoron trans postaj vokoj: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);
Ĉiu voko de
make-accumulatorproduktas freŝan blokon kun sia proprastate $total, do apartaj akumuliloj restas sendependaj — kaj la fermaĵo ĉirkaŭ$startankoraŭ provizas al ĉiu propran komencan valoron.