Курс по 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 тест върху съдържанието на тази тема.

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

Тест — Ламбди   |   Тест — Затваряния


💪 Или преминете направо към упражненията в този раздел.