Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Функциональное программирование / Лямбды и замыкания

Замыкания

Замыкание — это подпрограмма, которая захватывает переменные из области видимости, где была определена, и сохраняет их живыми даже после того, как эта область закончилась. Так подпрограмма получает собственное скрытое, устойчивое состояние.

Классический пример — счётчик:

sub make-counter {
    my $n = 0;
    return sub { ++$n };
}

my &count = make-counter;
say count(); # 1
say count(); # 2
say count(); # 3

Переменная $n объявлена внутри make-counter. Возвращаемая подпрограмма ссылается на $n, то есть замыкается на неё: каждый вызов count увеличивает и возвращает одну и ту же $n, хотя сам make-counter завершился уже давно.

Каждый вызов make-counter создаёт новую $n, поэтому отдельные счётчики независимы:

my &a = make-counter;
my &b = make-counter;
say a(); # 1
say a(); # 2
say b(); # 1

Замыкания позволяют функции нести состояние без глобальной переменной и без объекта. Это принятый в функциональном программировании способ помнить что-то между вызовами.

Практика

Пройдите 1 тест по содержанию этой темы.

Навигация по курсу

Тест — Лямбды   |   Тест — Замыкания


💪 Или перейдите сразу к упражнениям этого раздела.