有没有办法在它结束之前留下尖头块?

Paw*_*bkr 8 perl6

例如:

$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意味着跳过了块的其余部分.


Bra*_*ert 7

return是一个CONTROL例外

-> {
  return 42
}();

CONTROL {
  default {
    .^name.say; # CX::Return
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以包裹块的东西,有一个CONTROL块,或者一些已经处理CX::Returnsub

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)