En Perl, il existe une possibilité de rompre un cycle externe comme celui-ci:
AAA: for my $stuff (@otherstuff) {
for my $foo (@bar) {
last AAA if (somethingbad());
}
}
(la syntaxe peut être fausse), qui utilise un libellé de boucle pour séparer la boucle externe de la boucle interne. Y a-t-il quelque chose de similaire dans Ruby?
Ce que vous voulez, c'est un flux de contrôle non local, pour lequel Ruby dispose de plusieurs options:
throw
catch
Continuations
Avantages:
GOTO
.Les inconvénients:
Exceptions
Avantages:
Les inconvénients:
throw
catch
C'est à peu près à quoi ça ressemblerait:
catch :aaa do
stuff.each do |otherstuff|
foo.each do |bar|
throw :aaa if somethingbad
end
end
end
Avantages:
StopIteration
pour la résiliation.Les inconvénients:
Considérons throw
/catch
. Normalement, la boucle extérieure dans le code ci-dessous sera exécutée cinq fois, mais avec un lancer, vous pouvez la changer comme bon vous semble, en la cassant dans le processus. Considérez ce code Ruby parfaitement valide:
catch (:done) do
5.times { |i|
5.times { |j|
puts "#{i} #{j}"
throw :done if i + j > 5
}
}
end
Non, il n'y en a pas.
Vos options sont:
while c1
while c2
do_break=true
end
next if do_break
end
ou "pause si do_break" en fonction de ce que vous voulez
C'est peut-être ce que tu veux? (pas testé)
stuff.find do |otherstuff|
foo.find do
somethingbad() && AAA
end
end
La méthode find continue de boucler jusqu'à ce que le bloc renvoie une valeur non NULL ou que la fin de la liste soit atteinte.
Je sais que je vais le regretter le matin, mais le simple fait d’utiliser une boucle while pourrait suffire.
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
Le if y==5 && x==3
est seulement un exemple d'expression qui devient vraie.
Enrouler une méthode interne autour des boucles pourrait faire l'affaire Exemple:
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
Ici, vous pouvez vérifier toutes les boucles for et revenir de la méthode interne une fois la condition remplie.
Vous pouvez envisager d'ajouter un indicateur, placé à l'intérieur de la boucle interne, pour contrôler la boucle externe.
'next' la boucle externe
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
'casser' la boucle externe
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