Курс по 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 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.