Infelizmente, Ruby é um pouco diferente. PS: Minha memória está um pouco obscura com isso, então peço desculpas se eu estiver errado
em vez de quebrar / continuar, tem quebra / próximo, que se comporta da mesma maneira em termos de loops
Loops (como todo o resto) são expressões e "retornam" a última coisa que eles fizeram. Na maioria das vezes, obter o valor de retorno de um loop é inútil, então todo mundo faz isso
a = 5
while a < 10
a + 1
end
No entanto, você pode fazer isso
a = 5
b = while a < 10
a + 1
end # b is now 10
No entanto, muitos códigos ruby 'emulam' um loop usando um bloco. O exemplo canônico é
10.times do |x|
puts x
end
Como é muito mais comum as pessoas quererem fazer as coisas com o resultado de um bloco, é aqui que fica confuso. break / next significa coisas diferentes no contexto de um bloco.
break pulará do código que chamou o bloco
next pulará o restante do código no bloco e retornará o que você especificar para o chamador do bloco. Isso não faz sentido sem exemplos.
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.
Então sim. Ruby é incrível, mas tem alguns casos de canto horríveis. Este é o segundo pior que já vi nos meus anos de uso :-)