как вырвать цикл из кода в блоке (yield)? - PullRequest
1 голос
/ 18 января 2011
jobs.each do | job |
  msg job.name do
    break if stop_all_jobs?
    job.run!
  end
end   

def msg(msg, &block)
  puts 'START ' + msg
  yield
  puts 'END ' + msg
end

В приведенном выше примере break не выходит из цикла, как ожидалось.Это только вырывается из блока кода msg.

Это кажется немного странным, но я думаю, что это основано на контексте, который сказал, как мне выйти из цикла из кода, который находится внутриyield блок кода ed?

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Одним из способов является использование throw/catch. Нет, не исключение, в Ruby есть отдельная функция управления потоком, которая работает как исключения, без всяких накладных расходов (хотя я должен признать, что я не уверен, что нет никаких любых издержек используя его):

catch :stop_all_jobs do
  msg job.name do
    throw :stop_all_jobs if stop_all_jobs?
    job.run!
  end
end

Вы даже можете передать значение в качестве второго аргумента throw, который будет результатом блока catch.

Потенциально более читабельное решение, конечно, будет заключаться в упаковке кода в методе и использовании return вместо break. Но это было бы не так весело.

0 голосов
/ 18 января 2011

Используйте next вместо break.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...