ฉันสับสนมากเกี่ยวกับความแตกต่างระหว่างและ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_indexeach.with_index
เมื่อคุณรู้สึกว่าวิธีการเดียวสามารถแสดงออกได้อย่างง่ายดายโดยการผูกมัดอย่างตรงไปตรงมาของวิธีการสองสามวิธีโดยปกติจะเป็นกรณีที่วิธีการเดียวนั้นเร็วกว่าโซ่ ในฐานะที่เป็นเช่นนี้อีกจะทำงานได้เร็วกว่าreverse_each reverse.eachวิธีการเหล่านี้มีเหตุผลอยู่
reverseตัวอย่างreverseกำลังส่งคืนอาร์เรย์อื่นไม่ใช่ตัวแจงนับ หากส่งคืนตัวแจงนับก็ไม่ควรช้าลงด้วยการใช้งานที่ดี
with_indexอนุญาตให้ดัชนีเริ่มต้นชดเชยwith_indexเป็นที่ต้องการโดยทั่วไปเมื่อใช้ร่วมกับmap,reduce,collectและอื่น ๆ ในระยะสั้นอ่านดีกว่าmap.with_indexeach_with_index.mapในแง่หนึ่งเมื่อใช้กับmapมันเป็นแบบสแตนด์อินสำหรับmap_with_indexวิธีการที่ไม่มีอยู่จริง