Одним из способов является использование 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
. Но это было бы не так весело.