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

Коментарі

  1. task викликає log-it, але ніколи не згадує $*prefix. Значення все одно доходить до log-it, бо динамічний пошук іде назовні по стеку викликів — повз task — до того, хто в цю мить перебуває у стеку.

  2. Два блоки встановлюють різні значення, тож той самий виклик task() щоразу дає інший префікс. Саме це робить динамічні змінні корисними: контекст перетікає в глибоко вкладений код, не протягуючись аргументом крізь кожну проміжну підпрограму.

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

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