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
例外を使用します。短所:
throw
/catch
を検討してください。通常、以下のコードの外側のループは5回実行されますが、throwを使用すると、ループを好きなように変更して、プロセスを中断できます。この完全に有効なRubyコードを検討してください:
catch (:done) do
5.times { |i|
5.times { |j|
puts "#{i} #{j}"
throw :done if i + j > 5
}
}
end
いいえ、ありません。
オプションは次のとおりです。
while c1
while c2
do_break=true
end
next if do_break
end
または、必要に応じて「do_breakの場合はブレーク」
たぶん、これはあなたが望むものですか? (未検証)
stuff.find do |otherstuff|
foo.find do
somethingbad() && AAA
end
end
Findメソッドは、ブロックがnull以外の値を返すか、リストの最後に到達するまでループを続けます。
私は午前中にこれを後悔することを知っていますが、whileループを使用するだけでうまくいくかもしれません。
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になる例にすぎません。
内部メソッドをループの周りにラップすると、トリックを実行できます例:
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ループ内でチェックを行い、条件が満たされたときに内部メソッドから戻ることができます。
外側のループを制御するために、内側のループの内側に設定されるフラグを追加することを検討できます。
外側のループを「次へ」
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