例如:
$supply.tap: -> $message {
return unless server-is-alive( ); # forbidden!
send-to-server( $message );
}
我知道我可以“ .tap:sub($ message){返回,除非...;#有效!}”。但是我想知道是否有与块相关的控制流可以简单地中断它。
答案 0 :(得分:13)
目前,尚无这种机制。但是,已经建议可以有一个leave
,它可以满足您的要求。
使用Supply
时,通常最好使用supply
/ react
/ whenever
语法。如果使用它,则有另一种解决方案:由于whenever
是异步循环结构,因此可以编写:
whenever $supply -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
此处的next
意味着该块的其余部分将被跳过。
答案 1 :(得分:7)
return
是CONTROL
例外
-> {
return 42
}();
CONTROL {
default {
.^name.say; # CX::Return
}
}
您可以将块包装在具有CONTROL
块的东西中,或包装在已经处理CX::Return
的东西中,例如sub
my &c = ->{
return 42
}
sub {
c(); # call it
say 'never gets here';
}().say; # call it and say the result of `return`
我认为next
在水龙头上使用会更有意义。
$supply.tap: -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
目前不起作用。
无论如何,为什么不使用更好的[react
| supply
] / whenever
功能?
(哪个与next
/ last
一起使用)
react whenever $supply -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
请注意,它将阻塞当前线程以获取它,因此不会在前面添加start
。
测试代码:
# setup some messages
my $supply = Supply.interval(0.1).map: {
.Str.uninames.join(' ' x 4);
}
react {
my $server-is-alive = True;
sub server-is-alive (){ $server-is-alive }
sub send-to-server ( $message ){
say $message
}
whenever Supply.interval( 0.5 ) {
$server-is-alive = !$server-is-alive;
say "server is { 'not ' x !$server-is-alive }alive";
}
# here is your code
whenever $supply -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
whenever Promise.in(3) {
done
}
}
结果
server is not alive
server is alive
DIGIT FIVE
DIGIT SIX
DIGIT SEVEN
DIGIT EIGHT
DIGIT NINE
server is not alive
server is alive
DIGIT ONE DIGIT FIVE
DIGIT ONE DIGIT SIX
DIGIT ONE DIGIT SEVEN
DIGIT ONE DIGIT EIGHT
DIGIT ONE DIGIT NINE
server is not alive
server is alive
DIGIT TWO DIGIT FIVE
DIGIT TWO DIGIT SIX
DIGIT TWO DIGIT SEVEN
DIGIT TWO DIGIT EIGHT
DIGIT TWO DIGIT NINE
server is not alive