Курс 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 тест за змістом цієї теми.

Навігація курсом

Тест — Твігіли   |   Тест — Динамічні змінні


💪 Або перейдіть одразу до вправ цього розділу.