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.