Курс 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 тест за змістом цієї теми.
Навігація курсом
← Тест — Твігіли | Тест — Динамічні змінні →
💪 Або перейдіть одразу до вправ цього
розділу.