perbedaan antara each.with_index dan each_with_index di Ruby?

94

Saya sangat bingung tentang perbedaan antara each.with_indexdan each_with_index. Mereka memiliki tipe yang berbeda tetapi tampaknya identik dalam praktiknya.

Stan
sumber
6
Selain dari sedikit perbedaan yang with_indexmemungkinkan indeks mulai offset, with_indexumumnya lebih disukai bila digunakan bersama dengan map, reduce, collect, dll Singkatnya, map.with_indexmembaca lebih baik dari each_with_index.map. Dalam arti, ketika digunakan dengan map, itu adalah pengganti untuk metode yang tidak ada map_with_index.
Cary Swoveland

Jawaban:

172

The with_indexMetode mengambil parameter opsional untuk mengimbangi indeks awal. each_with_indexmelakukan hal yang sama, tetapi tidak memiliki indeks awal opsional.

Sebagai contoh:

[: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

Keluaran:

2: foo
3: bar
4: baz

0: foo
1: bar
2: baz
blacktide
sumber
41

each_with_indexdiperkenalkan ke Ruby sebelumnya. with_indexdiperkenalkan nanti:

  1. untuk memungkinkan penggunaan yang lebih luas dengan berbagai enumerator.
  2. untuk memungkinkan indeks dimulai dari angka selain 0.

Saat ini, penggunaan with_indexakan lebih baik dari sudut pandang umum dan keterbacaan, tetapi dari sudut pandang mempercepat kode, each_with_indexberjalan sedikit lebih cepat daripada each.with_index.

Ketika Anda merasa bahwa satu metode dapat dengan mudah diungkapkan dengan rangkaian langsung dari beberapa metode, biasanya metode tunggal lebih cepat daripada rantai. Adapun contoh lain dari ini, reverse_eachberlari lebih cepat dari reverse.each. Metode ini ada alasannya.

sawa
sumber
1
Agar adil, offset tidak mengubah indeks, itu hanya menambahkan angka ke indeks. Ketika Anda memeriksa indeks setelah panggilan Anda, Anda akan menemukan bahwa itu tidak terpengaruh. Catatan yang bagus seperti biasa, @sawa
vgoff
2
Saya tidak berpikir kinerja harus berbeda (setidaknya tidak secara substansial). Dalam reversecontoh, reversemengembalikan array lain, dan bukan enumerator. Jika mengembalikan enumerator, maka seharusnya tidak lebih lambat dengan implementasi yang baik.
akostadinov