Comment rompre avec les boucles nestedes dans Ruby?

supposons le code ruby ​​suivant:

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

NEXT BRANCH est bien sûr pseudocode. Existe-t-il un moyen de sortir d’une boucle parente, comme on peut le faire en Perl, par exemple (en utilisant des étiquettes de boucle)?

Merci d’avance.

Catch and jeter peut être ce que vous recherchez:

 bank.twigs 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 

Il n’y a pas de moyen intégré pour sortir des blocs contenant sans leur consentement. Vous devrez juste faire quelque chose comme:

 bank.twigs 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 

Mon impulsion serait de déplacer les blocs nesteds dans une méthode, avec un return à la place de la break .

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

Edit: L’effet souhaité, s’avère, peut être réalisé beaucoup plus simplement en appelant break à l’intérieur de la boucle interne (ne terminera que cette boucle):

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

Voici ce que @steenslag en était arrivé à écrire avec le bloc begin-rescue-end de Ruby:

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

Donc, votre exemple est:

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

D’autres articles ont référencé une idée similaire à la création d’une variable “switch”. Voir ci-dessous pour un exemple clair de la façon dont cela fonctionne. Gardez à l’esprit que la deuxième boucle continuera à s’exécuter jusqu’à la fin du tableau des employés, mais n’exécutera aucun code après le basculement du commutateur. Ce n’est pas la façon optimale de procéder, car cela peut être inutilement coûteux si votre tableau d’employés est volumineux.

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

Après le basculement du commutateur, le tableau interne ne sera plus actif et la boucle parente passera à la twig suivante avec la réinitialisation du commutateur. De toute évidence, d’autres commutateurs peuvent être utilisés pour des cas plus complexes.