Ruby: Wie iteriere ich über einen Bereich, aber in festgelegten Schritten?

155

Ich iteriere also über einen Bereich wie folgt:

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

Aber was ich tun möchte, ist um 10 zu iterieren.

Anstatt also num 1 zu erhöhen , wäre der nächste ntatsächlich 10, dann 20, 30 usw. usw.

Shpigford
quelle
1
Mögliches Duplikat stackoverflow.com/questions/2583665/about-ruby-range
Diego Dias
@DiegoDias aber das hat das Beste und dann den Thread
Jackson Jegatheesan

Antworten:

255

Die vollständige API finden Sie unter http://ruby-doc.org/core/classes/Range.html#M000695 .

Grundsätzlich verwenden Sie die step()Methode. Beispielsweise:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
Berin Loritsch
quelle
12
Diese Antwort führte mich zu dem, wonach ich suchte ... Wenn Sie zwei Mal haben, können Sie tun(time1..time2).step(15.minutes) do |time|
Daybreaker
11

Sie können verwenden 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
quelle
5
rng.step(n=1) {| obj | block } => rng

Iteriert über rng und übergibt jedes n-te Element an den Block. Wenn der Bereich Zahlen oder Zeichenfolgen enthält, wird die natürliche Reihenfolge verwendet. Andernfalls ruft step succ auf, um Bereichselemente zu durchlaufen. Der folgende Code verwendet Klasse Xs, die in der Dokumentation auf Klassenebene definiert ist.

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

produziert:

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

Referenz: http://ruby-doc.org/core/classes/Range.html

......

Jahan
quelle
5

Hier ist eine andere, vielleicht vertrautere Art, dies zu tun:

for i in (0..10).step(2) do
    puts i
end
justsomeguy
quelle
10
Entschuldigung, aber der Ruby Style Guide rät dringend von den Verwendungsschleifen ab for.
Darth Egregious
@DarthEgregious warum ist das so?
Doug
Es ist eine Erweiterung der Philosophie, dass jedes Ding ein Objekt und jede Aktion ein Methodenaufruf ist. Anstatt eine integrierte Schleife zum Schleifen zu verwenden for, sollten Sie die eachMethode verwenden.
Darth Egregious