有没有办法在其结束之前离开尖形块?

时间:2019-01-11 15:27:52

标签: perl6

例如:

$supply.tap: -> $message {
    return unless server-is-alive( );   # forbidden!
    send-to-server( $message );
}

我知道我可以“ .tap:sub($ message){返回,除非...;#有效!}”。但是我想知道是否有与块相关的控制流可以简单地中断它。

2 个答案:

答案 0 :(得分:13)

目前,尚无这种机制。但是,已经建议可以有一个leave,它可以满足您的要求。

使用Supply时,通常最好使用supply / react / whenever语法。如果使用它,则有另一种解决方案:由于whenever是异步循环结构,因此可以编写:

whenever $supply -> $message {
    next unless server-is-alive( );
    send-to-server( $message );
}

此处的next意味着该块的其余部分将被跳过。

答案 1 :(得分:7)

returnCONTROL例外

-> {
  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