Ruby desafortunadamente es un poco diferente. PD: Mi memoria es un poco confusa en esto, así que me disculpo si me equivoco
en lugar de break / continue, tiene break / next, que se comportan igual en términos de bucles
Los bucles (como todo lo demás) son expresiones y "devuelven" lo último que hicieron. La mayoría de las veces, obtener el valor de retorno de un bucle no tiene sentido, por lo que todo el mundo hace esto
a = 5
while a < 10
a + 1
end
Sin embargo, puedes hacer esto
a = 5
b = while a < 10
a + 1
end # b is now 10
SIN EMBARGO, una gran cantidad de código ruby 'emula' un bucle utilizando un bloque. El ejemplo canónico es
10.times do |x|
puts x
end
Como es mucho más común que las personas quieran hacer cosas con el resultado de un bloqueo, aquí es donde se complica. break / next significa cosas diferentes en el contexto de un bloque.
el salto saltará del código que llamó al bloque
siguiente omitirá el resto del código en el bloque y "devolverá" lo que especifique a la persona que llama del bloque. Esto no tiene ningún sentido sin ejemplos.
def timesten
10.times{ |t| puts yield t }
end
timesten do |x|
x * 2
end
# will print
2
4
6
8 ... and so on
timesten do |x|
break
x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped
timesten do |x|
break 5
x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5
timesten do |x|
next 5
x * 2
end
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.
Así que sí. Ruby es increíble, pero tiene algunos esquinas horribles. Este es el segundo peor que he visto en mis años de usarlo :-)