Как «вырваться» из дела ... пока в Ruby - PullRequest
13 голосов
/ 05 ноября 2011

Итак, я пробовал break, next и return. Все они дают ошибки, exit, конечно, работает, но это полностью выходит. Итак, как бы закончить case...when «слишком рано?»

Пример:

case x
    when y; begin
        <code here>
        < ** terminate somehow ** > if something
        <more code>
    end
end

(Выше приведен некий вид псевдокода, просто чтобы дать общее представление о том, что я спрашиваю [начало ... конец был использован с надеждой, что break будет работать].

И, пока я в этом, есть ли более элегантный способ передачи блоков в case...when?

Ответы [ 3 ]

7 голосов
/ 06 ноября 2011

Что не так с:

case x
when y;
    <code here>
    if !something
        <more code>
    end
end

Обратите внимание, что if !something совпадает с unless something

4 голосов
/ 10 июля 2014

Вот ответ, аналогичный технике WarHog дал:

case x
when y
    begin
        <code here>
        break if something
        <more code>
    end while false
end

или, если вы предпочитаете:

case x
when y
    1.times do
        <code here>
        break if something
        <more code>
    end
end
4 голосов
/ 06 ноября 2011

Я вижу пару возможных решений.Во-первых, вы можете определить свой блок инструкций в некотором методе:

def test_method
  <code here>
  return if something
  <more code>
end

case x
  when y
    test_method
end

С другой стороны, вы можете использовать catch-throw, но я считаю, что это более уродливый и нерубиновый способ :)

catch :exit do
  case x
    when y
      begin
        <code here>
        throw :exit if something
        <more code>
      end
  end
end
...