Saya telah mencarinya di Google dan mendapatkan pendapat yang tidak jelas / kontradiktif - apakah sebenarnya ada perbedaan antara melakukan map
dan mengerjakan collect
array pada Ruby / Rails?
The docs tampaknya tidak menyarankan, tetapi ada mungkin perbedaan dalam metode atau kinerja?
map
lebih disukai di Code Golf .map
lebih disukai di CodeGolf, yang mungkin tidak jelas untuk semua: itu hanya karenacollect
empat karakter lebih panjang darimap
, tetapi fungsionalitas yang sama.collect
lebih mudah dibaca dan alami - ide 'mengumpulkan' catatan dan melakukan X untuk mereka lebih masuk akal bagi saya daripada 'memetakan' catatan dan melakukan X untuk mereka.Jawaban:
Tidak ada perbedaan, sebenarnya
map
diimplementasikan dalam C asrb_ary_collect
danenum_collect
(mis. Ada perbedaan antaramap
pada array dan pada enum lainnya, tetapi tidak ada perbedaan antaramap
dancollect
).Mengapa keduanya
map
dancollect
ada di Ruby? Themap
fungsi memiliki banyak konvensi penamaan dalam bahasa yang berbeda. Wikipedia memberikan gambaran :Ruby menyediakan alias untuk programmer dari dunia Smalltalk untuk merasa lebih di rumah.
Mengapa ada implementasi yang berbeda untuk array dan enum? Enum adalah struktur iterasi yang digeneralisasi, yang berarti bahwa tidak ada cara di mana Ruby dapat memprediksi apa elemen berikutnya (Anda dapat mendefinisikan enum tak terbatas, lihat Prime untuk contoh). Karena itu ia harus memanggil fungsi untuk mendapatkan setiap elemen berurutan (biasanya ini akan menjadi
each
metode).Array adalah koleksi paling umum sehingga masuk akal untuk mengoptimalkan kinerjanya. Karena Ruby tahu banyak tentang cara kerja array, ia tidak perlu memanggil
each
tetapi hanya dapat menggunakan manipulasi pointer sederhana yang jauh lebih cepat.Optimalisasi serupa ada untuk sejumlah metode Array seperti
zip
ataucount
.sumber
count
,length
atausize
. Kata yang berbeda untuk atribut array yang sama, tetapi dengan ini, Ruby memungkinkan Anda untuk memilih kata yang paling tepat untuk kode Anda: apakah Anda ingin jumlah item yang Anda kumpulkan, panjang array, atau ukuran saat ini dari struktur. Pada dasarnya, semuanya sama, tetapi memilih kata yang tepat mungkin membuat kode Anda lebih mudah dibaca, yang merupakan properti bahasa yang bagus.Saya sudah diberitahumereka sama.Sebenarnya mereka didokumentasikan di tempat yang sama di ruby-doc.org:
http://www.ruby-doc.org/core/classes/Array.html#M000249
sumber
Saya melakukan tes benchmark untuk mencoba dan menjawab pertanyaan ini, kemudian menemukan posting ini jadi inilah temuan saya (yang sedikit berbeda dari jawaban lainnya)
Berikut ini adalah kode benchmark:
Dan hasil yang saya dapatkan adalah:
Mungkin alias tidak gratis?
sumber
Metode
collect
dancollect!
adalah alias untukmap
danmap!
, sehingga mereka dapat digunakan secara bergantian. Berikut ini cara mudah untuk mengonfirmasi bahwa:sumber
Ruby alias metode Array # map ke Array # collect; mereka dapat digunakan secara bergantian. (Ruby Monk)
Dengan kata lain, kode sumber yang sama:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
sumber