Курс языка программирования Raku / Продвинутый уровень / Контейнеры / Специальные и динамические переменные / Exercises / Переопределение динамической переменной
Решение: Переопределение динамической переменной
Вот возможное решение задачи.
Код
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()каждый раз выдаёт разный префикс. Именно это делает динамические переменные полезными: контекст проникает в глубоко вложенный код без необходимости передавать его через каждую промежуточную подпрограмму в качестве аргумента.
Навигация по курсу
← Переопределение динамической переменной | Переменная-тема →