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.



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

Respostas:



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

6

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

for i in (0..10).step(2) do
    puts i
end

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

......

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.