Loops em Ruby com métodos times e upto

Dicas - 04/Abr/2021 - por André Kanamura

Ruby é uma linguagem que oferece uma grande quantidade de ferramentas que nos ajudam a executar uma diversidade de tarefas. Para iterar por coleções de dados, por exemplo, os métodos mais comuns são o map e o each, mas podemos encontrar muitos outros. Para criar laços de repetição, existem o while e o loop. Sempre podemos encontrar uma maneira interessante de executar exatamente o que precisamos. Se quisermos repetir a execução de um trecho de código uma determinada quantidade de vezes, é tentador usar o while com uma variável que cresce a cada iteração. Mas Ruby possui dois métodos na classe Integer que permitem executar algo semelhante: o times e o upto.

Vamos considerar o seguinte exemplo de código:

i = 0
while i < 3 do
   puts "Ruby"
   i = i + 1
end

Ruby
Ruby
Ruby
 => nil 

No código acima, a variável i tem como única função contar a quantidade de vezes que o código foi executado. Essa estrutura é muito comum para iterar por arrays ou repetir ações por um determinado número de vezes. Mas temos outras ferramentas que deixam essa implementação mais enxuta e legível. Vamos começar falando do método times:

3.times do
  puts "Ruby"
end

Ruby
Ruby
Ruby
 => 3

O código acima imprime 3 vezes a string "Ruby na tela, e o valor retornado é sempre a própria Integer em que o método foi chamado. Qualquer código colocado dentro do bloco será repetido tantas vezes quanto for o valor do número no qual o método for chamado. Também podemos expor uma variável com a qual podemos interagir a cada iteração, por exemplo:

3.times do |valor|
  puts valor
end

0
1
2
 => 3 

A variável, nesse caso chamada valor, sempre começa em 0 e a cada iteração, 1 é somado a ela. Embora seja possível expor essa variável com o times, em situações em que o valor da variável exposta é relevante, o método a seguir pode ser mais funcional.

O upto é parecido com o times, a diferença é que podemos definir o valor inicial e final da iteração. Veja o exemplo abaixo:

3.upto(5) do |valor|
  puts valor
end

3
4
5
 => 3 

De forma semelhante ao times, o bloco de código será executado uma determinada quantidade de vezes, mas temos controle sobre o valor inicial e final da variável, neste caso começando com 3 e vamos somando mais 1 a ela até chegar em 5.

Também é possível chamar 3.upto(5) do sem expor uma variável, mas parece mais interessante usar o método times para essas situações em que o valor da variável não importa.

Note como esses dois métodos permitem criar laços de repetição sem a necessidade de criar variáveis que têm como única função contar quantas vezes o loop foi executado. Embora o while seja muito versátil, em Ruby é muito comum encontrarmos métodos mais funcionais e que permitem implementações mais enxutas e legíveis.

Referências e outras leituras

Foto de perfil do autor
André Kanamura

Dev na Campus Code