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

LEAVE е особено полезен, защото се изпълнява дори ако блокът бъде напуснат преждевременно, което го прави надеждно място за освобождаване на ресурс.

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

  1. Почистване при напускане
  2. Влизане в блок
  3. След всяка стъпка

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

Тест — Фейзъри   |   Почистване при напускане