Курс языка программирования 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 тест по содержанию этой темы.
Навигация по курсу
← Тест — Лямбды | Тест — Замыкания →
💪 Или перейдите сразу к упражнениям этого
раздела.