Ruby Language retour vs suivant: retour non local dans un bloc


Exemple

Considérez cet extrait cassé :

def foo
  bar = [1, 2, 3, 4].map do |x|
    return 0 if x.even?
    x
  end
  puts 'baz'
  bar
end
foo # => 0

On pourrait s'attendre à ce que le return donne une valeur pour le tableau de résultats de bloc de map . Donc, la valeur de retour de foo serait [1, 0, 3, 0] . Au lieu de cela, return renvoie une valeur de la méthode foo . Notez que baz n'est pas imprimé, ce qui signifie que l'exécution n'a jamais atteint cette ligne.

next avec une valeur fait le tour. Il agit comme un return niveau du bloc.

def foo
  bar = [1, 2, 3, 4].map do |x|
    next 0 if x.even?
    x
  end
  puts 'baz'
  bar
end
foo # baz
    # => [1, 0, 3, 0]

En l'absence de return , la valeur renvoyée par le bloc est la valeur de sa dernière expression.