Array#each
mengeksekusi blok yang diberikan untuk setiap elemen array, lalu mengembalikan array itu sendiri.
Array#map
juga mengeksekusi blok yang diberikan untuk setiap elemen larik, tetapi mengembalikan larik baru yang nilainya adalah nilai kembalian dari setiap iterasi blok.
Contoh: asumsikan Anda memiliki array yang didefinisikan sebagai berikut:
arr = ["tokyo", "london", "rio"]
Kemudian coba jalankan each
:
arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]
Perhatikan nilai yang dikembalikan hanyalah array yang sama. Kode di dalam each
blok dijalankan, tetapi nilai yang dihitung tidak dikembalikan; dan karena kode tersebut tidak memiliki efek samping, contoh ini tidak berfungsi.
Sebaliknya, memanggil metode larik akan map
mengembalikan larik baru yang elemennya adalah nilai kembalian dari setiap putaran menjalankan map
blok:
arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]
The efek samping yang sama yang menambahkan beberapa kebingungan untuk reverse engineering Anda.
Ya, keduanya melakukan iterasi atas array (sebenarnya, atas apa pun yang bercampur di Enumerable ) tetapi map akan mengembalikan Array yang terdiri dari hasil blok sementara masing - masing hanya akan mengembalikan Array asli.
Nilai yang dikembalikan dari masing - masing hanyalah array asli dan jarang digunakan dalam kode Ruby tetapi map adalah salah satu alat fungsional yang paling penting .
Apa yang
map
dilakukan adalah mengembalikan array yang berisi hasil dari blok atau metode bernama yang dilewatkan. Sebagai contoh:Dalam hal ini saya tidak melewatkan satu blok tetapi hanya a
Symbol
, namunclass Symbol
objek memilikito_proc
metode yang akan menghasilkan:BTW, Anda mungkin kesulitan menemukan dokumentasi karena map adalah metode di Enumerable sedangkan masing-masing (satu metode yang diperlukan oleh modul Enumerable ) adalah metode di Array .
Sebagai catatan trivia: implementasi peta didasarkan pada masing-masing .
sumber
Berikut adalah demo singkat tentang perbedaan peta dari masing-masing
Anda melihat bahwa peta pengembalian
["map_a", "map_b", "map_c"]
sedangkan masing-masing hanya iterates tapi mengembalikan array asli:["a", "b", "c"]
.Jadi masing-masing digunakan untuk memproses array dan peta digunakan untuk melakukan sesuatu dengan array yang diproses.
sumber
.each
mengembalikan larik yang sama yang Anda berikan pada awalnya:.map
mengembalikan Array baru dari hasil setiap panggilan blok:sumber
Array # setiap metode mengembalikan array yang sama
Metode array # map mengembalikan array baru
sumber
ketika Anda menggunakan map ke hash, itu secara implisit mentransmisikan hash ke sebuah array, jadi Anda memilikinya
vs. setiap {...} hanya memberikan Anda kembali evaluasi terakhir, yaitu [11, 22] untuk ["d", [11, 22]] dan [33, 44, 55] untuk ["f", [ 33, 44, 55]]. Jadi sebelum bergabung terakhir, Anda harus
sumber
Anda juga bisa menggunakan
map
dengan bangmap!
itu mengubah array sumbersumber
each
, yang mengeksekusi blok yang diberikan dan mengembalikan array asli; danmap
, yang mengembalikan larik dengan hasil mengeksekusi blok sebagai nilai