Cursus Raku / Geavanceerd / Containers / Speciale en dynamische variabelen
Dynamische variabelen
Een dynamische variabele heeft de *-twigil. In
tegenstelling tot een lexicale variabele, die alleen zichtbaar is in het
blok waar deze is gedeclareerd, wordt een dynamische variabele gevonden
door naar buiten te zoeken via de call stack — door wie
de huidige code heeft aangeroepen, ongeacht waar die code is
gedefinieerd.
my $*greeting = 'Hello';
sub greet {
say $*greeting;
}
greet(); # HelloDe subroutine greet declareert $*greeting
niet en ontvangt het niet als argument, maar kan het toch zien, omdat de
variabele dynamisch is en greet werd aangeroepen vanaf een
plek waar deze in scope is.
Dit voorbeeld zou ook werken met een eenvoudige globale scalar
variabele $greeting, maar de aard van dynamische variabelen
wordt zichtbaar in het volgende voorbeeld.
Omdat het opzoeken de call stack volgt, overschrijft een dichterbij liggende declaratie een verder weg liggende voor de duur van het blok:
my $*level = 'outer';
sub show {
say $*level;
}
show(); # outer
{
my $*level = 'inner';
show(); # inner
}Dezelfde show print outer de eerste keer en
inner wanneer deze wordt aangeroepen vanuit het blok dat
$*level opnieuw declareerde. Dit is dynamische
scoping, en zo werken de ingebouwde $*OUT,
$*IN en $*ERR van Raku — je kunt uitvoer
tijdelijk omleiden door $*OUT in een blok opnieuw te
declareren, en elke routine die je daarbinnen aanroept ziet de nieuwe
waarde. Dynamische variabelen zijn ideaal voor context die naar
aangeroepen code moet doorstromen zonder als expliciet argument te
worden meegegeven.
Praktijk
Maak de 1 quiz over de inhoud van dit onderwerp.
Cursusnavigatie
← Quiz — Twigils | Quiz — Dynamische variabelen →
💪 Of ga direct naar de oefeningen in
deze sectie.