Курс языка программирования Raku / Продвинутый уровень / Порядок выполнения
Фазеры блоков
Помимо фазеров уровня программы, в Raku есть фазеры, привязанные к жизненному циклу отдельного блока или цикла.
Вход и выход из блока
Фазер ENTER выполняется каждый раз, когда исполнение
входит в блок, а фазер LEAVE выполняется каждый раз, когда
выходит из блока — независимо от того, на какой строке они написаны:
say 'before block';
{
LEAVE say 'leaving';
ENTER say 'entering';
say 'inside';
}
say 'after block';Вывод показывает, что ENTER выполняется первым, а
LEAVE — последним, оборачивая тело блока:
before block
entering
inside
leaving
after blockLEAVE особенно полезен тем, что выполняется даже при
досрочном выходе из блока, что делает его надёжным местом для
освобождения ресурсов.
Фазер может принимать полный блок { } вместо одного
выражения, и можно задавать несколько фазеров. Если в блоке несколько
LEAVE, они срабатывают в обратном порядке — последний
зарегистрированный выполняется первым, так что блок разматывается как
стек:
say 'open A';
{
LEAVE {
say 'close A';
}
say 'open B';
LEAVE {
say 'close B';
}
say 'work';
}
say 'done';Ресурс A открывается первым и закрывается последним:
open A
open B
work
close B
close A
doneЭтот порядок «последним пришёл — первым ушёл» — именно то, что нужно
для очистки: то, что было настроено последним, разрушается первым. Фазер
END уровня программы ведёт себя так же — несколько блоков
END также выполняются в порядке, обратном порядку их
написания.
Фазеры цикла
Внутри циклов доступны ещё три фазера, отмечающие этапы итерации:
FIRST выполняется один раз перед первой итерацией,
LAST — один раз после последней, а NEXT — в
конце каждой итерации:
for 1..3 {
FIRST say '-- first';
LAST say '-- last';
NEXT say "-- next (was $_)";
say "body $_";
}Цикл выводит:
-- first
body 1
-- next (was 1)
body 2
-- next (was 2)
body 3
-- next (was 3)
-- lastКак и с другими фазерами, положение FIRST,
NEXT и LAST в исходном коде не имеет значения
— каждый выполняется в свой момент.
Практика
Пройдите 1 тест по содержанию этой темы.
Упражнения
В этом разделе 3 упражнения. Прежде чем приступать к практике, изучите все темы раздела.