Ruby: Como iterar em um intervalo, mas em incrementos definidos?

156

Então, eu estou iterando em um intervalo como este:

(1..100).each do |n|
    # n = 1
    # n = 2
    # n = 3
    # n = 4
    # n = 5
end

Mas o que eu gostaria de fazer é iterar aos dez anos.

Então, em vez de aumentar nem 1, o próximo nseria na verdade 10, depois 20, 30, etc. etc.

Shpigford
fonte
@DiegoDias mas isso tem o melhor e depois esse tópico
Jackson Jegatheesan

Respostas:

256

Consulte http://ruby-doc.org/core/classes/Range.html#M000695 para obter a API completa.

Basicamente, você usa o step()método Por exemplo:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
Berin Loritsch
fonte
12
Essa resposta me levou ao que eu estava procurando ... Se você tem duas vezes, você pode fazer(time1..time2).step(15.minutes) do |time|
Daybreaker
12

Você pode usar Numeric#step.

0.step(30,5) do |num|
  puts "number is #{num}"
end
# >> number is 0
# >> number is 5
# >> number is 10
# >> number is 15
# >> number is 20
# >> number is 25
# >> number is 30
Arup Rakshit
fonte
6

Aqui está outra maneira, talvez mais familiar, de fazer isso:

for i in (0..10).step(2) do
    puts i
end
justsomeguy
fonte
10
Desculpe, mas o guia de estilo ruby ​​desencoraja fortemente os forloops de uso .
Darth Egregious
@DarthEgregious por que isso?
Doug
É uma extensão da filosofia de que tudo é um objeto e toda ação é uma chamada de método. Portanto, em vez de usar um built-in para loop for, você deve usar o eachmétodo
Darth Egregious
5
rng.step(n=1) {| obj | block } => rng

Repete sobre rng, passando cada enésimo elemento para o bloco. Se o intervalo contiver números ou cadeias, a ordem natural será usada. Caso contrário, a etapa chama succ para iterar pelos elementos do intervalo. O código a seguir usa a classe Xs, definida na documentação em nível de classe.

range = Xs.new(1)..Xs.new(10)
range.step(2) {|x| puts x}
range.step(3) {|x| puts x}

produz:

1 x
3 xxx
5 xxxxx
7 xxxxxxx
9 xxxxxxxxx
1 x
4 xxxx
7 xxxxxxx
10 xxxxxxxxxx

Referência: http://ruby-doc.org/core/classes/Range.html

......

Jahan
fonte