Курс Raku / Додаток 🆕 / Порядок виконання та функції / Підпрограми та функційний стиль / Вправи / Накопичувач значень
Розв’язання: Накопичувач значень
Ось одне з можливих розв’язань задачі.
Код
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і далі постачає кожному його власне початкове значення.