Курс по Raku / Напреднали / Контейнери / Специални и динамични променливи 🆕
Динамични променливи
Динамичната променлива има туигил *. За разлика
от лексикалната променлива, която е видима само в блока, където е
декларирана, динамичната променлива се намира чрез търсене навън
през стека на извикванията — през този, който е извикал текущия
код, независимо къде е дефиниран този код.
my $*greeting = 'Hello';
sub greet {
say $*greeting;
}
greet(); # HelloПодпрограмата greet не декларира $*greeting
и не я получава като аргумент, но въпреки това може да я види, защото
променливата е динамична и greet е извикана от място,
където тя е в обхват.
Този пример би работил и с обикновена глобална скаларна променлива
$greeting, но природата на динамичните променливи ще се
види в следващия пример.
Тъй като търсенето следва стека на извикванията, по-близка декларация заменя по-далечната за времетраенето на нейния блок:
my $*level = 'outer';
sub show {
say $*level;
}
show(); # outer
{
my $*level = 'inner';
show(); # inner
}Същата show отпечатва outer първия път и
inner, когато е извикана отвътре на блока, който
предекларира $*level. Това е динамично обхващане и
именно така работят вградените $*OUT, $*IN и
$*ERR на Raku — можете временно да пренасочите изхода, като
предекларирате $*OUT в блок, и всяка подпрограма, която
извикате вътре в него, вижда новата стойност. Динамичните променливи са
идеални за контекст, който трябва да тече в извиквания код, без да се
предава като изричен аргумент.
Практика
Направете 1 тест върху съдържанието на тази тема.
Навигация в курса
← Тест — Twigils | Тест — Динамични променливи →
💪 Или преминете направо към упражненията в този
раздел.