Ruby: จะวนซ้ำช่วงอย่างไร แต่เพิ่มทีละชุด?


156

ดังนั้นฉันซ้ำในช่วงดังนี้:

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

แต่สิ่งที่ฉันต้องการทำคือทำซ้ำโดย 10's

ดังนั้นแทนที่จะเพิ่มขึ้นn1, อันถัดไปnก็คือ 10, 20, 30 เป็นต้น



@DiegoDias แต่สิ่งนี้มีสิ่งที่ดีที่สุดและจากนั้นด้าย
Jackson Jegatheesan

คำตอบ:


256

ดูhttp://ruby-doc.org/core/classes/Range.html#M000695สำหรับ API แบบเต็ม

โดยทั่วไปคุณใช้step()วิธีการ ตัวอย่างเช่น:

(10..100).step(10) do |n|
    # n = 10
    # n = 20
    # n = 30
    # ...
end

12
คำตอบนี้นำฉันไปสู่สิ่งที่ฉันกำลังมองหา ... หากคุณมีสองครั้งคุณสามารถทำได้(time1..time2).step(15.minutes) do |time|
daybreaker


6

นี่เป็นอีกวิธีหนึ่งที่อาจดูคุ้นเคยมากกว่า:

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

10
ขออภัยคู่มือทับทิมสไตล์ขอแนะนำให้ใช้forลูป
Darth Egregious

@DarthEgregious เหตุใดจึงเป็นเช่นนั้น
Doug

มันเป็นส่วนขยายของปรัชญาที่ทุกสิ่งเป็นวัตถุและทุกการกระทำเป็นการเรียกวิธีการ ดังนั้นแทนที่จะใช้ built-in สำหรับการวนซ้ำด้วยforคุณควรใช้eachวิธีนี้
Darth Egregious

5
rng.step(n=1) {| obj | block } => rng

ทำซ้ำผ่าน rng ส่งองค์ประกอบที่สามไปยังบล็อก หากช่วงนั้นมีตัวเลขหรือสตริงระบบจะใช้การเรียงลำดับแบบธรรมชาติ มิฉะนั้นขั้นตอนจะเรียกใช้เพื่อทำซ้ำผ่านองค์ประกอบช่วง รหัสต่อไปนี้ใช้คลาส X ซึ่งกำหนดไว้ในเอกสารระดับชั้นเรียน

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

ผลิต:

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

การอ้างอิง: http://ruby-doc.org/core/classes/Range.html

......

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.