Controle de loops com next e break em Ruby

Artigos - 21/Out/2020 - por André Kanamura

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.

Referências

Foto de perfil do autor
André Kanamura

Dev na Campus Code