Курс по Raku / Приложение 🆕 / Поток и функции / Подпрограми и функционален стил / Exercises / Натрупвател на стойности
Решение: Натрупвател на стойности
Ето едно възможно решение на задачата.
Код
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);🦋 Намерете програмата във файла accumulator.raku.
Изход
110
135
130Коментари
Върнатият блок се затваря върху
$total: тази променлива живее между извикванията, така че всяко извикване помни сумата от предишното.$total += $amountедновременно обновява текущата сума и я връща, а точно това отпечатва всякоsay:110, после135, после130.Друг вариант държи сумата вътре в самия блок, в променлива
state. За разлика от обикновенатаmy, променливатаstateсе инициализира само веднъж — при първото изпълнение на блока — и после запазва стойността си при следващите извиквания: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);
Всяко извикване на
make-accumulatorдава нов блок със собственаstate $total, така че отделните акумулатори остават независими — а затварянето върху$startпродължава да доставя на всеки собствената му начална стойност.
Навигация в курса
← Натрупвател на стойности | Сума на квадратите на четните →