Курс Raku / Розширені / Контейнери / Спеціальні та динамічні змінні 🆕 / Вправи / Перевизначити динамічну
Розв’язання: Перевизначити динамічну
Ось один із можливих варіантів розв’язання задачі.
Код
sub log-it($msg) {
say "$*prefix: $msg";
}
sub task {
log-it('working');
}
{
my $*prefix = 'INFO';
task();
}
{
my $*prefix = 'DEBUG';
task();
}🦋 Вихідний код можна знайти у файлі override-dynamic.raku.
Вивід
INFO: working
DEBUG: workingКоментарі
taskвикликаєlog-it, але ніколи не згадує$*prefix. Значення все одно доходить доlog-it, бо динамічний пошук іде назовні по стеку викликів — повзtask— до того, хто в цю мить перебуває у стеку.Два блоки встановлюють різні значення, тож той самий виклик
task()щоразу дає інший префікс. Саме це робить динамічні змінні корисними: контекст перетікає в глибоко вкладений код, не протягуючись аргументом крізь кожну проміжну підпрограму.