Ruby 2.6 adiciona funcionalidade “range sem fim”

Dando continuidade às novidades que estão surgindo para a versão 2.6 do Ruby, mais uma que chamou a atenção foi a “range sem fim / endless range”.

A ideia é simples…

Como fazer um loop infinito que já nos dê um índice?

Para resolver o problema acima podemos implementar diversos tipos de solução, mas, prezando pelo “the ruby way” de ser, facilitando sempre a vida para os desenvolvedores, eis que agora temos uma forma muito elegante para fazer isso.

Os ranges (intervalos) em Ruby já existem desde os primórdios e para usá-los faríamos como no exemplo abaixo:

(1..5).each do |i|
puts i
end

Dessa simples forma conseguimos iterar em uma sequência de números e ainda ganhamos um índice para nos guiar.

O que o Ruby 2.6 fez foi permitir que agora não informemos o número final do intervalo, tornando assim a interação infinita, veja:

(1..).each do |i|
puts i
sleep(1)
end

Como pode-se observar, o intervalo (1..) fará um loop infinito e também já nos dará um índice.

Uma outra forma de fazer a mesma coisa, também permitida apenas no Ruby 2.6, é usar o nil para indicar que não há fim para o loop, veja:

(1..nil).each do |i|
puts i
sleep(1)
end

O resultado será o mesmo que o exemplo anterior.

No Ruby 2.5 já era possível conseguir fazer um loop infinito com índice dessa forma:

(1..Float::INFINITY).each do |i|
puts i
sleep(1)
end

ou ainda…

1.step.each do |n|
puts i
end

No entanto, o novo formato usado pelo Ruby 2.6 nos abre a possibilidade de de programar de forma mais intuitiva (na minha opinião, claro).

Por fim, podemos observar que agora existe uma classe que representa o “Infinito”, veja o exemplo abaixo.

(0..nil).size
=> Infinity
(0..).size
=> Infinity

Além disso, o “intervalo infinito” do Ruby 2.6 nos permite fazer coisas como isso…

> ‘ABCDEFGHIJ’[2..] 
=> “CDEFGHIJ”

Ou seja, podemos indicar, por exemplo, que queremos a substring a partir do índice 2. No Ruby 2.5 usaríamos o -1 para fazer a mesma coisa, veja…

> ‘ABCDEFGHIJ’[2..-1] 
=> “CDEFGHIJ”

Enfim, conforme falei, acredito que o novo formato deixa mais intuitiva a programação. 😉

É isso, gente! Espero que tenho gostado, e até a próxima!