Duas maneiras de usar Range em Ruby

Dicas - 14/Fev/2021 - por Marcus Pereira

Em programação o Range é a representação de um intervalo de valores entre um valor inicial e um final. Esse conceito existe em muitas linguagens e Ruby oferece algumas formas diferentes de trabalhar com ranges.

Pessoas que já tem experiência com desenvolvimento e começam a programar em Ruby muitas vezes acabam usando o "sotaque" de outras linguagens. Em Python, por exemplo, um range poderia ser criado assim:

range(1, 10)

Em Javascript é possível fazer algo semelhante usando Array().keys:

[...Array(5).keys()];
=> [0, 1, 2, 3, 4]

Ruby é uma linguagem muito intuitiva e a ideia da linguagem é ser o mais humana possível. Sendo assim, um range pode ser feito dessa maneira:

irb(main):001:0> 1..10
=> 1..10

irb(main):002:0> (1..10).class
=> Range

Transformando um range em array:

irb(main):003:0> (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Legal né? 🌝

Algo que acontece com muita frequência é precisarmos iterar por um array sem conhecermos exatamente a quantidade de elementos que ele possui, e as pessoas que estão começando a programar em Ruby fariam algo assim usando range:

irb(main):004:0> (1..numero - 1).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

O Range do Ruby possui duas formas de notação: o .. e o .... A diferença entre eles está realmente no alcance. Enquanto o .. vai de x até o y, com o ..., vai de x a y -1.

Exemplo usando o ..:

irb(main):005:0> (1..9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

Exemplo usando o ...:

irb(main):006:0> (1...9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8]

Também vale lembrar que ranges funcionam com letras, por exemplo:

irb(main):001:0> ('a'..'g')
 => "a".."g" 

irb(main):002:0> ('a'..'g').to_a
 => ["a", "b", "c", "d", "e", "f", "g"] 

Bacana né? Aprendemos um pouco mais sobre range. Com certeza o trabalho de vocês vai ficar bem mais produtivo.

Referências

Foto de perfil do autor
Marcus Pereira

Dev

Desenvolvedor, gosta de ler e apaixonado por mergulho. Gosta de falar sobre o mundo da tecnologia e ama dogs =)