Курс по 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   |   Тест — Динамични променливи


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