Ruby: Bagaimana cara mengulang pada rentang, tetapi dalam peningkatan yang ditetapkan?

156

Jadi saya mengulangi rentang seperti:

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

Tapi yang ingin saya lakukan adalah beralih pada tahun 10-an.

Jadi sebagai ganti meningkat n1, yang berikutnya nakan benar-benar 10, lalu 20, 30, dll.

Shpigford
sumber
1
Kemungkinan duplikat stackoverflow.com/questions/2583665/about-ruby-range
Diego Dias
@DiegoDias tetapi ini memiliki yang terbaik dan kemudian utas itu
Jackson Jegatheesan

Jawaban:

256

Lihat http://ruby-doc.org/core/classes/Range.html#M000695 untuk API lengkap.

Pada dasarnya Anda menggunakan step()metode ini. Sebagai contoh:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end
Berin Loritsch
sumber
12
Jawaban ini membawa saya ke apa yang saya cari ... Jika Anda memiliki dua kali, Anda dapat melakukannya(time1..time2).step(15.minutes) do |time|
daybreaker
12

Anda bisa menggunakannya 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
sumber
6

Inilah cara lain yang mungkin lebih familiar untuk dilakukan:

for i in (0..10).step(2) do
    puts i
end
justsomeguy
sumber
10
Maaf, tetapi panduan gaya ruby ​​sangat tidak menyarankan forloop penggunaan .
Darth Egregious
@ DarthEgregious kenapa begitu?
Doug
Ini merupakan perpanjangan dari filosofi bahwa setiap hal adalah objek dan setiap tindakan adalah panggilan metode. Jadi daripada menggunakan built-in untuk mengulang for, Anda harus menggunakan eachmetode ini.
Darth Egregious
5
rng.step(n=1) {| obj | block } => rng

Iterasi lebih dari rng, melewati setiap elemen ke blok. Jika rentang berisi angka atau string, pemesanan alami digunakan. Kalau tidak, langkah memanggil succ untuk beralih melalui elemen rentang. Kode berikut menggunakan kelas X, yang didefinisikan dalam dokumentasi tingkat kelas.

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

menghasilkan:

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

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

......

Jahan
sumber