例如:
$supply.tap: -> $message {
return unless server-is-alive( ); # forbidden!
send-to-server( $message );
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以".tap:sub($ message){return除非...;#works!}".但我想知道是否有任何与块相关的控制流只能中断它.
Jon*_*ton 13
目前,没有这样的机制.但是,有人建议可以有一个leave,这可以做你要求的.
使用Supply它时通常更好地使用supply/ react/ whenever语法.如果使用它,还有另一种解决方案:既然whenever是异步循环结构,那么可以编写:
whenever $supply -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
Run Code Online (Sandbox Code Playgroud)
这next意味着跳过了块的其余部分.
return是一个CONTROL例外
-> {
return 42
}();
CONTROL {
default {
.^name.say; # CX::Return
}
}
Run Code Online (Sandbox Code Playgroud)
你可以包裹块的东西,有一个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`
Run Code Online (Sandbox Code Playgroud)
我认为next在水龙头上使用会更有意义.
$supply.tap: -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
Run Code Online (Sandbox Code Playgroud)
目前无效.
无论如何你为什么不使用更好的[ react| supply] / whenever功能?
(哪个适用于next/ last)
react whenever $supply -> $message {
next unless server-is-alive( );
send-to-server( $message );
}
Run Code Online (Sandbox Code Playgroud)
请注意,它将阻止当前线程,以便它不会添加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
}
}
Run Code Online (Sandbox Code Playgroud)
这导致了
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
Run Code Online (Sandbox Code Playgroud)