Ruby: Jak iterować w zakresie, ale w określonych krokach?

156

Więc iteruję w takim zakresie:

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

Ale chciałbym zrobić iterację po dziesiątkach.

Więc zamiast zwiększać no 1, następna nbędzie faktycznie 10, potem 20, 30 itd. Itd.

Shpigford
źródło
@DiegoDias, ale to ma najlepsze, a potem ten wątek
Jackson Jegatheesan

Odpowiedzi:

256

Zobacz http://ruby-doc.org/core/classes/Range.html#M000695, aby zapoznać się z pełnym interfejsem API.

Zasadniczo używasz step()metody. Na przykład:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
Berin Loritsch
źródło
12
Ta odpowiedź doprowadziła mnie do tego, czego szukałem ... Jeśli masz dwa razy, możesz zrobić(time1..time2).step(15.minutes) do |time|
świt
12

Możesz użyć 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
źródło
6

Oto inny, być może bardziej znajomy sposób na zrobienie tego:

for i in (0..10).step(2) do
    puts i
end
justsomeguy
źródło
10
Przepraszamy, ale przewodnik po stylu ruby ​​zdecydowanie odradza używanie forpętli użytkowania .
Darth Egregious
@DarthEgregious, dlaczego tak jest?
Doug
Jest to rozszerzenie filozofii, zgodnie z którą każda rzecz jest przedmiotem, a każde działanie jest wywołaniem metody. Więc zamiast używać wbudowanej pętli for, powinieneś użyć tej eachmetody.
Darth Egregious
5
rng.step(n=1) {| obj | block } => rng

Iteruje po rng, przekazując każdy n-ty element do bloku. Jeśli zakres zawiera liczby lub ciągi, stosowany jest porządek naturalny. W przeciwnym razie step wywołuje succ do iteracji przez elementy zakresu. Poniższy kod używa klas X, które są zdefiniowane w dokumentacji na poziomie klasy.

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

produkuje:

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

Źródła: http://ruby-doc.org/core/classes/Range.html

......

Jahan
źródło