在 Perl 中,有一种打破外循环的能力,如下所示:
AAA: for my $stuff (@otherstuff) {
for my $foo (@bar) {
last AAA if (somethingbad());
}
}
(语法可能错误),它使用循环标签将外循环从内循环内部断开。 Ruby 有类似的东西吗?
你想要的是非本地控制流,Ruby 有几个选项可以做到这一点:
throw
/catch
继续
优点:
GOTO
的更好双胞胎
.缺点:
例外情况
优点:
缺点:
throw
/
catch
这(大致)是这样的:
catch :aaa do
stuff.each do |otherstuff|
foo.each do |bar|
throw :aaa if somethingbad
end
end
end
优点:
与异常相同。
StopIteration
异常来终止。
Ruby 社区对它们的憎恨甚至超过了对控制流使用异常的憎恨。
您的选择是:
将循环放入方法中并使用 return 来从外循环中中断
或“break if do_break”取决于你想要什么
stuff.find do |otherstuff|
foo.find do
somethingbad() && AAA
end
end
find 方法不断循环,直到块返回非空值或到达列表末尾。
test = [1,2,3]
test.each do |num|
def internalHelper
for i in 0..3
for j in 0..3
puts "this should happen only 3 times"
if true
return
end
end
end
end
internalHelper
end
在这里,您可以在任何 for 循环内进行检查,并在满足条件后从内部方法返回。
x=0
until x==10
x+=1
y=0
until y==10
y+=1
if y==5 && x==3
x,y=10,10
end
end
break if x==10
puts x
end
if y==5 && x==3
只是表达式变为 true 的一个示例。
“下一个”外循环
for i in (1 .. 5)
next_outer_loop = false
for j in (1 .. 5)
if j > i
next_outer_loop = true if j % 2 == 0
break
end
puts "i: #{i}, j: #{j}"
end
print "i: #{i} "
if next_outer_loop
puts "with 'next'"
next
end
puts "withOUT 'next'"
end
“打破”外循环
for i in (1 .. 5)
break_outer_loop = false
for j in (1 .. 5)
if j > i
break_outer_loop = true if i > 3
break
end
puts "i: #{i}, j: #{j}"
end
break if break_outer_loop
puts "i: #{i}"
end