Курс 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

Коментарі

  1. Повернений блок замикається на $total: ця змінна живе між викликами, тож кожен виклик пам’ятає суму з попереднього.

  2. $total += $amount водночас оновлює наростаючу суму й повертає її, а це і є те, що друкує кожен say: 110, потім 135, потім 130.

  3. Альтернатива тримає суму всередині самого блоку, у змінній 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 і далі постачає кожному його власне початкове значення.

Навігація курсом

Накопичувач значень   |   Сума квадратів парних чисел