web-dev-qa-db-fra.com

En Ruby, comment sauter une boucle dans une boucle .each similaire à 'continue'

En Ruby, comment sauter une boucle dans une boucle .each, semblable à continue dans d'autres langues?

310
Blankman

Utilisez next:

(1..10).each do |a|
  next if a.even?
  puts a
end

impressions:

1
3   
5
7
9

Pour plus de fraîcheur, consultez également redo et retry.

Fonctionne également pour des amis comme times, upto, downto, each_with_index, select, map et d'autres itérateurs (et plus généralement de blocs).

Pour plus d'informations, voir http://Ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#UL .

545
Jakub Hampl

next - c'est comme return, mais pour les blocs! (Vous pouvez donc utiliser ceci dans n'importe quel proc/lambda aussi.)

Cela signifie que vous pouvez également dire next n pour "retourner" n du bloc. Par exemple:

puts [1, 2, 3].map do |e|
  next 42 if e == 2
  e
end.inject(&:+)

Cela donnera 46.

Notez que returntoujours renvoie du plus proche def, et jamais un bloc; S'il n'y a pas de voisinage def, returning est une erreur.

L'utilisation intentionnelle de return à l'intérieur d'un bloc peut prêter à confusion. Par exemple:

def my_fun
  [1, 2, 3].map do |e|
    return "Hello." if e == 2
    e
  end
end

my_fun donnera "Hello." et non pas [1, "Hello.", 2], car le mot clé return concerne le def extérieur, pas le bloc interne.

48
Ashe