Bagaimana cara saya memodifikasi array saat saya mengulanginya di Ruby?

88

Saya baru saja belajar Ruby, jadi mohon maaf jika ini terlalu pemula untuk di sekitar sini, tapi saya tidak bisa menyelesaikan ini dari buku beliung (mungkin hanya tidak membaca dengan cukup hati-hati). Bagaimanapun, jika saya memiliki array seperti ini:

arr = [1,2,3,4,5]

... dan saya ingin, katakanlah, mengalikan setiap nilai dalam array dengan 3, saya telah menyelesaikannya dengan melakukan hal berikut:

arr.each {|item| item *= 3}

... tidak akan mendapatkan apa yang saya inginkan (dan saya mengerti mengapa, saya tidak memodifikasi array itu sendiri).

Yang tidak saya dapatkan adalah bagaimana memodifikasi array asli dari dalam blok kode setelah iterator. Saya yakin ini sangat mudah.

brad
sumber

Jawaban:

140

Gunakan mapuntuk membuat array baru dari yang lama:

arr2 = arr.map {|item| item * 3}

Gunakan map!untuk mengubah larik di tempat:

arr.map! {|item| item * 3}

Lihat itu bekerja secara online: ideone

Mark Byers
sumber
2
Kalau memang perlu memodifikasi tiap elemen, menggunakan map pasti lebih elegan, imho.
fresskoma
2
Dan jika Anda ingin memodifikasi array itu sendiri, gunakan map! sebagai gantinya
Yoann Le Touche
18

Untuk mengubah array secara langsung, gunakan arr.map! {|item| item*3}. Untuk membuat array baru berdasarkan yang asli (yang seringkali lebih disukai), gunakan arr.map {|item| item*3}. Faktanya, saya selalu berpikir dua kali sebelum menggunakan each, karena biasanya ada fungsi tingkat tinggi seperti map, selectatau injectitu melakukan apa yang saya inginkan.

Membuang
sumber
Bagaimana jika Anda tidak ingin melakukan operasi pencacahan? Bagaimana jika Anda hanya ingin melakukan sesuatu seperti arr.map!{ destructive_op}untuk berubah secara permanen arr?
terang
1
@TrevorAlexander: Saya tidak yakin apa yang Anda maksud. Mungkin layak untuk ditanyakan sebagai pertanyaan nyata dengan detail dan hal-hal lainnya.
Chuck
Saya harus memikirkannya. Selain modifikasi elemen yang sangat sempit, operasi destruktif apa pada struktur yang tidak dapat dihitung?
terang
@TrevorAlexander: Saya masih kesulitan memahami. Jika Anda tidak dapat melihat konten struktur, Anda tidak dapat mengubah isinya. Sepertinya Anda tidak tertarik untuk memodifikasi struktur, dan sebaliknya hanya ingin menetapkan variabel - tetapi saya mungkin salah paham.
Chuck
5
arr.collect! {|item| item * 3}
Jeff Richardson
sumber