Курс по 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

Коментари

  1. task извиква log-it, но никога не споменава $*prefix. Стойността все пак достига log-it, защото динамичното търсене следва стека на извикванията навън — покрай task — до този, който е на стека по това време.

  2. Двата блока задават различни стойности, така че същото извикване на task() произвежда различен префикс всеки път. Това е, което прави динамичните променливи полезни: контекстът тече в дълбоко вложен код, без да се предава през всяка междинна подпрограма като аргумент.

Навигация в курса

Презаписване на динамична променлива   |   Тематичната променлива