ไวยากรณ์สำหรับการวนซ้ำในทับทิม


87

ฉันจะทำแบบนี้สำหรับการวนซ้ำใน Ruby ได้อย่างไร?

for(int i=0; i<array.length; i++) {

}

@johannes การอ่านหนังสือเป็นความคิดที่ดี แต่ไม่ควรอ่านเกี่ยวกับ Ruby 1.6!
Andrew Grimm

อย่าลืมที่จะดูที่วิธีการที่มีประโยชน์บางอย่างในทับทิม doc: โมดูล
Ivan Chau

คำตอบ:


118
array.each do |element|
  element.do_stuff
end

หรือ

for element in array do
  element.do_stuff
end

หากคุณต้องการดัชนีคุณสามารถใช้สิ่งนี้:

array.each_with_index do |element,index|
  element.do_stuff(index)
end

15
ฉันกำลังมองหาการจัดทำดัชนีแบบวนซ้ำโดยเฉพาะไม่มีวิธีแก้ปัญหาใดที่ทำให้ชัดเจนในทันทีว่าจะทำอย่างไร หน่วยปฏิบัติการทรยศต่อความตั้งใจของเขาด้วยอาร์เรย์ความยาวในรหัส ...
jheriko

6
อ่านคำตอบของฉันอย่างระมัดระวัง มีโซลูชันการวนซ้ำพร้อมการจัดทำดัชนี
Eimantas

8
บ่อยครั้งeachเป็นเรื่องที่ดี แต่บางครั้งฉันก็แค่ต้องการแบบดั้งเดิมที่น่ากลัวสำหรับการวนซ้ำ บางครั้ง "วิถีทับทิม" อาจเป็นเรื่องน่ารำคาญ
Ruben Martinez Jr.

1
ฉันจะตั้งค่าดัชนีด้วยทับทิมด้วยตนเองได้อย่างไรเพื่อให้ฉันสามารถเขียนเรียงลำดับด้วยตัวเอง
มูฮัมหมัด Umer

6
จะเกิดอะไรขึ้นถ้าฉันต้องการข้ามการทำซ้ำสองครั้งถัดไป
มูฮัมหมัดอู

77
limit = array.length;
for counter in 0..limit
 --- make some actions ---
end

วิธีอื่นในการดำเนินการดังต่อไปนี้

3.times do |n|
  puts n;
end

ที่จะพิมพ์ 0, 1, 2 ดังนั้นสามารถใช้เช่นตัววนซ้ำอาร์เรย์ได้เช่นกัน

คิดว่าตัวแปรนั้นเหมาะกับความต้องการของผู้เขียนมากกว่า


29

ฉันกดปุ่มนี้เป็นลิงก์บนสุดของ Google "Ruby for loop" อยู่เรื่อย ๆ ดังนั้นฉันจึงต้องการเพิ่มวิธีแก้ปัญหาสำหรับลูปที่ขั้นตอนไม่ได้เป็นเพียงแค่ '1' สำหรับกรณีเหล่านี้คุณสามารถใช้เมธอด 'ขั้นตอน' ที่มีอยู่ในอ็อบเจ็กต์ Numerics และ Date ฉันคิดว่านี่เป็นค่าประมาณที่ใกล้เคียงสำหรับลูป 'for'

start = Date.new(2013,06,30)
stop = Date.new(2011,06,30)
# step back in time over two years, one week at a time
start.step(stop, -7).each do |d| 
    puts d
end

20

ความเท่าเทียมกันจะเป็น

for i in (0...array.size)
end

หรือ

(0...array.size).each do |i|
end

หรือ

i = 0
while i < array.size do
   array[i]
   i = i + 1 # where you may freely set i to any value
end

17
array.each_index do |i|
  ...
end

ไม่ใช่ Rubyish มากนัก แต่เป็นวิธีที่ดีที่สุดในการวนซ้ำจากคำถามใน Ruby


นี่เป็นสิ่งที่ยอดเยี่ยม มันเป็นความจริงว่าคำตอบคือไม่ได้แต่each each_index+1
Dan Rosenstark

12

หากต้องการวนซ้ำตามจำนวนครั้งที่กำหนดให้ลอง:

n.times do
  #Something to be done n times
end

10

หากคุณไม่จำเป็นต้องเข้าถึงอาร์เรย์ของคุณ (ง่ายๆสำหรับการวนซ้ำ) คุณสามารถใช้ไม่เกินหรือแต่ละอัน:

จนถึง:

1.9.3p392 :030 > 2.upto(4) {|i| puts i}
2
3
4
 => 2 

แต่ละ:

1.9.3p392 :031 > (2..4).each {|i| puts i}
2
3
4
 => 2..4 

8

อะไร? ตั้งแต่ปี 2010 และไม่มีใครพูดถึง Ruby ว่ามีค่าปรับสำหรับ / ในวง (ไม่มีใครใช้):

ar = [1,2,3,4,5,6]
for item in ar
  puts item
end

5
ข้อดีอย่างหนึ่งของ. each ... doคือบล็อกชั่วคราวหลุดออกจากขอบเขตที่ส่วนท้ายของลูปในขณะที่...ออกจากขอบเขตชั่วคราว
Wayne Conrad


0

ไวยากรณ์การแจงนับของรูบี้แตกต่างกัน:

collection.each do |item|
...
end

สิ่งนี้อ่านว่า "การเรียกไปยังเมธอด 'each' ของอินสแตนซ์อ็อบเจ็กต์อาร์เรย์ที่ใช้บล็อกโดยมี 'blockargument' เป็นอาร์กิวเมนต์" ไวยากรณ์ของบล็อกใน Ruby คือ 'do ... end' หรือ '{... }' สำหรับคำสั่งบรรทัดเดียว

อาร์กิวเมนต์บล็อก '| item |' เป็นทางเลือก แต่ถ้าระบุไว้อาร์กิวเมนต์แรกจะแทนรายการที่แจกแจงแบบวนซ้ำโดยอัตโนมัติ

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