Introdução
Em programação costumamos usar next
e break
para interromper a execução de um loop. O break
vai parar o loop imediatamente, enquanto o next
vai pular a iteração atual e passar para a seguinte. Neste artigo vamos utilizar como exemplo base o código abaixo:
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lista.map do |item|
puts item
end
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
# => [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
Definimos um array e iteramos por ele imprimindo na tela o valor de cada item
. Ao final, o retorno de cada iteração é entregue em um array.
Vamos começar mostrando como funciona o break
.
Break
No código abaixo, incluímos o break
pedindo para que o loop seja interrompido quando chegar no item
de valor 5.
lista.map do |item|
break if item == 5
puts item
end
# 1
# 2
# 3
# 4
# => nil
Note como são impressos na tela somente os números de um a 4, afinal o loop foi interrompido no 5. Ao final, o retorno é nil
. Se quisermos definir o valor do retorno, podemos passá-lo como argumento ao break
.
Passando argumentos ao break
Considere o exemplo abaixo:
lista.map do |item|
break item if item == 5
puts item
end
# 1
# 2
# 3
# 4
# => 5
Dessa maneira, o break
retorna o valor do próprio item
no qual o loop foi interrompido.
Talvez você esteja se perguntando porquê não usar o return
. Se usarmos o return
no lugar do break
na implementação de um método, a execução do método seria abortada por completo, enquanto com o break
somente o loop seria interrompido.
Next
Diferente do break
, o next
não interrompe o loop por completo, ele pula a iteração atual e passa para a seguinte. Por exemplo:
lista.map do |item|
next if item.odd?
puts item
end
# 2
# 4
# 6
# 8
# 10
# => [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
Note como a cada iteração, o next
impediu que os números ímpares fossem impressos em tela. Ao final, o retorno é um array inteiro de valores nil
. Agora veremos a diferença quando passamos um argumento com o next
.
Passando argumentos ao next
Considere o exemplo a seguir:
lista.map do |item|
next item if item.odd?
puts item
end
# 2
# 4
# 6
# 8
# 10
# => [1, nil, 3, nil, 5, nil, 7, nil, 9, nil]
Dessa maneira, os mesmos valores são impressos em tela pelo puts
, mas o array retornado contém todos os valores ímpares e nil
, onde estariam os pares.
Como next
também é implementado em classes como String
e Integer
, é possível fazer coisas como:
41.next
# => 42
"a".next
# => "b"
Conclusão
Neste artigo vimos como manipular a execução de loops em Ruby usando break
e next
, interrompendo-os por completo ou pulando uma iteração, sendo possível passar argumentos aos métodos para controlar o retorno.