如何打破Ruby中的嵌套循环?

假设下面的ruby代码:

bank.branches do |branch| branch.employees.each do |employee| NEXT BRANCH if employee.name = "John Doe" end end 

NEXT BRANCH当然是伪代码。 有没有一种方法,我可以打破父母循环,例如在Perl中可以这样做(通过使用循环标签)?

提前致谢。

抓住抛出可能是你在找什么:

 bank.branches do |branch| catch :missingyear do #:missingyear acts as a label branch.employees.each do |employee| (2000..2011).each do |year| throw :missingyear unless something #break out of two loops end end end #You end up here if :missingyear is thrown end 

未经他们的同意,没有任何内置的方法来打开包含块。 你只需要做一些事情:

 bank.branches do |branch| break unless branch.employees.each do |employee| break if employee.name == "John Doe" end end 
 while c1 while c2 # execute code do_break = true if need_to_break_out_of_parent_loop end break if do_break end 

我的冲动是将嵌套块移到一个方法中, return代替break

 def find_branch_and_employee_by_name(bank,emp_name) bank.branches.each do |branch| branch.employees.each do |employee| return([branch,employee]) if employee.name == emp_name end end nil # employee wasn't found end 

编辑:想要的效果,事实certificate,可以通过在内部循环中调用break来简单地实现(只会终止该循环):

 bank.branches do |branch| branch.employees.each do |employee| break if employee.name = "John Doe" end end 

以下是@steenslag用Ruby开始 – 拯救 – 结束块写的内容:

 letters = [%w(abc),%w(def),%w(ghi)] # => [["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"]] letters.each do |trine| begin trine.each do |letter| raise "Breaking out of inner cycle." if letter == "e" puts letter end rescue next end end # => abcdghi 

所以你的例子是:

 bank.branches do |branch| branch.employees.each do |employee| begin raise "Breaking out of inner cycle." if employee.name = "John Doe" rescue next end end end 

其他post引用了一个类似于创build“开关”variables的想法。 请参阅下面的清楚的例子它是如何工作的。 请记住,第二个循环将继续运行,直到到达雇员数组的末尾,但在交换机翻转后不会执行任何代码。 这不是实现这个目标的最佳方法,因为如果你的员工数组很大,这可能会花费不必要的时间。

 def workforce bank.branches do |branch| switch = 0 branch.employees.each do |employee| if switch == 1 next end if employee.name = "John Doe" switch = 1 end end end 

在开关翻转之后,内部数组将不再有效,并且在开关重置的情况下,父循环将移动到下一个分支。 显然更多的开关可以用于更复杂的情况。