如何在Julia中跳出嵌套的for循环

16

我曾试图以一种相当无效的方式打破嵌套循环:

BreakingPoint = false
a=["R1","R2","R3"]
b=["R2","R3","R4"]
for i in a
  for j in b
    if i == j
      BreakingPoint = true
      println("i = $i, j = $j.")
    end
    if BreakingPoint == true; break; end
  end
  if BreakingPoint == true; break; end
end

有没有更简单的方法呢?在我的实际问题中,我不知道数组ab中有什么内容,除了它们是ASCIIString。数组名称(代码示例中的ab)也是通过元编程方法自动生成的。

2个回答

28

你可以做两件事情:

将循环语句(如果这是它的名称)放在多个外部循环中。

for i in a, j in b
    if i == j
        break
    end 
end 

这很干净,但并非总是可行的。

我提出来可能会被批判,但你可以使用 @goto 和 @label。

for i in a
    for j in b
        if i == j
            @goto escape_label
        end
    end
end

@label escape_label
如果您选择使用 @goto/@label 的方式,请为了代码的维护和审查方便,充分记录您的用法,因为使用标签导航代码令人难以忍受。
有关多重循环退出的讨论,请参见此处

7
标签中最难读懂的部分实际上就是带有命名为 break 或随机布尔值的标签。只要不被滥用,@goto@label 完全没有必要招致负面评价。一些程序员甚至过度地避免使用它们,结果反而使代码更加难懂,因为他们会用布尔值混合代替 @goto - Fengyang Wang
2
我赞同你的观点,我喜欢使用标签,很少使用布尔锁,因为它们感觉笨重。 - isebarn
1
我喜欢这个答案,但是“我会因为说这个而被钉在十字架上”让我忍不住笑了 :-D。必看:https://xkcd.com/292/ - Dave C
这就是@goto的全部内容。在C语言中也是如此。 - Israel Unterman

19
将2D循环放入函数中,在您想要break时进行早期的return

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接