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.



@DiegoDias, ale to ma najlepsze, a potem ten wątek
Jackson Jegatheesan

Odpowiedzi:



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

6

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

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

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

......

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.