Это действительно комбинация CONTROL
и CX::Succeed
, которая предотвращает поведение по умолчанию last
.
Все функции управления потоком реализованы в виде исключений.
Вместо того, чтобы смешивать их с регулярными исключениями в CATCH
, для них есть специальный обработчик с именем CONTROL
.
И CATCH
, и CONTROL
можно рассматривать какспециальные формы given
.
Два основных различия заключаются в том, что в теме задано исключение и что что-то особенное происходит, если было CX::Succeed
.
Если существует CX::Succeed
затем это означает, что исключение или управление потоком было успешно обработано, и что дальнейшая обработка не требуется.
Существует два способа получить CX::Succeed
внутри CONTROL
.
default
block when
block
(Технически я думаю, что просто succeed
также должен работать, но это не кажетсяк.)
Если вы находитесь в одном из этих блоков, и выЕсли вы хотите продолжить обработку, вы можете использовать proceed
(CX::Proceed
).
loop {
once {
CX::Vaya.new( message => "I messed up!" ).throw;
}
last;
CONTROL {
default {
.^name.say;
proceed if CX::Last;
}
}
}
Гораздо лучше просто использовать блок when
, который захватывает именно то, что вы хотите обработать специально.
(Обратите внимание, что постфикс when
не выбрасывает CX::Succeed
, поэтому в этом случае обычная обработка будет продолжаться.)
default
- префикс блока.Это означает, что за ним всегда должен следовать блок.
Добавление только :
в конец идентификатора используется только для создания метки, а при вызовах методов - для удаления скобок.
Так что default:
здесь абсолютно ничего не делает.
Также once
- это , а не префикс блока.Это префикс заявления.(Так уж получилось, что блок можно рассматривать как оператор.)
Нет смысла добавлять туда блок, если вы не собираетесь писать более одного оператора внутри него.
loop {
once CX::Vaya.new( message => "I messed up!" ).throw;
last;
CONTROL {
when CX::Vaya {
.^name.say;
}
}
}