ฉันสับสนมากเกี่ยวกับความแตกต่างระหว่างและeach.with_index
each_with_index
พวกเขามีประเภทที่แตกต่างกัน แต่ดูเหมือนจะเหมือนกันในทางปฏิบัติ
ฉันสับสนมากเกี่ยวกับความแตกต่างระหว่างและeach.with_index
each_with_index
พวกเขามีประเภทที่แตกต่างกัน แต่ดูเหมือนจะเหมือนกันในทางปฏิบัติ
คำตอบ:
with_index
วิธีการใช้เวลาพารามิเตอร์ตัวเลือกเพื่อชดเชยดัชนีเริ่มต้น each_with_index
ทำสิ่งเดียวกัน แต่ไม่มีดัชนีเริ่มต้นที่เป็นทางเลือก
ตัวอย่างเช่น:
[:foo, :bar, :baz].each.with_index(2) do |value, index|
puts "#{index}: #{value}"
end
[:foo, :bar, :baz].each_with_index do |value, index|
puts "#{index}: #{value}"
end
ผลลัพธ์:
2: foo
3: bar
4: baz
0: foo
1: bar
2: baz
each_with_index
ได้รับการแนะนำให้รู้จักกับ Ruby ก่อนหน้านี้ with_index
ได้รับการแนะนำในภายหลัง:
0
ที่จะช่วยให้ดัชนีเริ่มต้นจากจำนวนอื่นที่ไม่ใช่วันนี้ใช้with_index
จะดีกว่าจากมุมมองของทั่วไปและการอ่าน แต่จากมุมมองของการเร่งขึ้นรหัสที่ทำงานได้เร็วขึ้นกว่าเล็กน้อยeach_with_index
each.with_index
เมื่อคุณรู้สึกว่าวิธีการเดียวสามารถแสดงออกได้อย่างง่ายดายโดยการผูกมัดอย่างตรงไปตรงมาของวิธีการสองสามวิธีโดยปกติจะเป็นกรณีที่วิธีการเดียวนั้นเร็วกว่าโซ่ ในฐานะที่เป็นเช่นนี้อีกจะทำงานได้เร็วกว่าreverse_each
reverse.each
วิธีการเหล่านี้มีเหตุผลอยู่
reverse
ตัวอย่างreverse
กำลังส่งคืนอาร์เรย์อื่นไม่ใช่ตัวแจงนับ หากส่งคืนตัวแจงนับก็ไม่ควรช้าลงด้วยการใช้งานที่ดี
with_index
อนุญาตให้ดัชนีเริ่มต้นชดเชยwith_index
เป็นที่ต้องการโดยทั่วไปเมื่อใช้ร่วมกับmap
,reduce
,collect
และอื่น ๆ ในระยะสั้นอ่านดีกว่าmap.with_index
each_with_index.map
ในแง่หนึ่งเมื่อใช้กับmap
มันเป็นแบบสแตนด์อินสำหรับmap_with_index
วิธีการที่ไม่มีอยู่จริง