Cursus Raku / Functioneel, concurrent, reactief en webprogrammeren / Functioneel programmeren / Lambda’s en closures

Closures

Een closure is een subroutine die variabelen vastlegt uit het bereik waarin ze gedefinieerd is, en die in leven houdt zelfs nadat dat bereik geëindigd is. Zo krijgt de subroutine haar eigen private, blijvende toestand.

Het klassieke voorbeeld is een teller:

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

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

De variabele $n is binnen make-counter gedeclareerd. De teruggegeven subroutine verwijst naar $n en sluit er dus omheen: elke aanroep van count verhoogt en geeft dezelfde $n terug, hoewel make-counter zelf allang klaar is.

Elke aanroep van make-counter maakt een verse $n, dus aparte tellers zijn onafhankelijk:

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

Closures laten een functie toestand meedragen zonder globale variabele en zonder object. Het is de functioneel-programmeerwijze om iets tussen aanroepen te onthouden.

Praktijk

Maak de 1 quiz over de inhoud van dit onderwerp.

Cursusnavigatie

Quiz — Lambda’s   |   Quiz — Closures


💪 Of ga direct naar de oefeningen in deze sectie.