Utilisez le mot-clé next
. Si vous ne souhaitez pas passer à l'élément suivant, utilisez break
.
Lorsqu'il next
est utilisé dans un bloc, il provoque la fermeture immédiate du bloc, renvoyant le contrôle à la méthode itérateur, qui peut alors commencer une nouvelle itération en invoquant à nouveau le bloc:
f.each do |line| # Iterate over the lines in file f
next if line[0,1] == "#" # If this line is a comment, go to the next
puts eval(line)
end
Lorsqu'il est utilisé dans un bloc, break
transfère le contrôle hors du bloc, hors de l'itérateur qui a appelé le bloc et vers la première expression suivant l'invocation de l'itérateur:
f.each do |line| # Iterate over the lines in file f
break if line == "quit\n" # If this break statement is executed...
puts eval(line)
end
puts "Good bye" # ...then control is transferred here
Et enfin, l'utilisation de return
dans un bloc:
return
provoque toujours le retour de la méthode englobante, quelle que soit sa profondeur d'imbrication dans les blocs (sauf dans le cas des lambdas):
def find(array, target)
array.each_with_index do |element,index|
return index if (element == target) # return from find
end
nil # If we didn't find the element, return nil
end
next
,break
,return
, Vous ne pouvez pas comparernext
oubreak
avec un argument.redo
, qui ramène simplement l'exécution en haut du bloc dans l'itération actuelle.Je voulais juste pouvoir sortir d'un bloc - un peu comme un goto avant, pas vraiment lié à une boucle. En fait, je veux rompre un bloc qui est dans une boucle sans terminer la boucle. Pour ce faire, j'ai fait du bloc une boucle d'une itération:
J'espère que cela aidera le prochain googleur qui atterrit ici en fonction de la ligne d'objet.
la source
Si vous voulez que votre bloc pour retourner une valeur utile (par exemple lors de l' utilisation
#map
,#inject
etc.),next
etbreak
également accepter un argument.Considérer ce qui suit:
L'équivalent en utilisant
next
:Bien sûr, vous pouvez toujours extraire la logique nécessaire dans une méthode et l'appeler de l'intérieur de votre bloc:
la source
break
!break
(remplacez probablement l'un des vôtresnext
parbreak
..break something
fonctionne,break(something)
fonctionne maistrue && break(somehting)
donne une erreur de syntaxe. Juste FYI. Si la condition est nécessaire, alorsif
ouunless
doit être utilisée.utilisez le mot-clé
break
au lieu dereturn
la source
Vous pouvez peut-être utiliser les méthodes intégrées pour rechercher des éléments particuliers dans un tableau, au lieu de
each
-ingtargets
et de tout faire à la main. Quelques exemples:Un exemple serait de faire quelque chose comme ceci:
la source
next
etbreak
semblent faire la bonne chose dans cet exemple simplifié!sortie: 1 3 4 5 6 7 8
la source
Pour sortir d'un bloc rubis, utilisez simplement un
return
mot-cléreturn if value.nil?
la source
return
la fonction?