Есть ли способ покинуть заостренный блок до его окончания? - PullRequest
0 голосов
/ 11 января 2019

Например:

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

Я знаю, что могу ".tap: sub ($ message) {вернуть, если ...; # работает!}". Но я хотел бы знать, существует ли какой-либо поток управления, связанный с блоком, который может просто прервать его.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

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
0 голосов
/ 11 января 2019

В настоящее время такого механизма нет. Тем не менее, было высказано предположение, что может быть leave, который будет делать то, что вы запрашиваете.

При работе с Supply обычно лучше использовать синтаксис supply / react / whenever. Если использовать это, есть другое решение: поскольку whenever является асинхронной конструкцией цикла, то можно написать:

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

Здесь next означает, что остальная часть блока пропущена.

...