Memahami Keunikan Ruby : array.map(&:method)

Ruby sering kali memiliki beberapa idiom unik yang tidak dikenal pada bahasa lainnya. Salah satunya dan yang sering digunakan adalah bentuk array.map(&:method). Saya tahu cara menggunakan bentuk ini dan juga cukup sering menggunakannya. Yang baru saya tahu adalah proses di dalamnya sebenarnya bagaimana.

Seingat saya dan kalau tidak salah, pertama kali melihat bentuk seperti ini adalah pada saat di kantor sedang ada event competitive programming internal untuk karyawan bagian engineering, khususnya backend engineer.

Saya berasumsi kamu sudah paham tentang penggunaan map. Kode di atas adalah bentuk manis dari kode di bawah ini.

Nah sekarang pertanyaannya adalah bagaimana bisa bentuk .map(&:to_i) berkelakuan seperti itu?

Semua bisa dimulai dari tanda &. Jika pada sebuah pemanggilan method memiliki parameter yang diawali dengan tanda & maka Ruby akan menganggapnya sebagai sebuah objek Proc dan jika ternyata yang bersangkutan bukan Proc maka Ruby akan menjalankan method to_proc supaya jadi Proc.

Kode berikut ini jika dijalankan akan menghasilkan error wrong argument type Foo (expected Proc). Hal ini karena objek dari kelas Foo jelas-jelas bukan Proc dan instance dari kelas ini tidak memiliki method to_proc.

Method to_proc harus dimiliki supaya Ruby bisa mengubahnya menjadi Proc. Kita ubah kodenya menjadi seperti ini, menambahkan method to_proc yang dibutuhkan.

See?, nothing’s magic going on here 😉

Selanjutnya jika sudah tahu & akan mengubah suatu objek dari suatu kelas menjadi Proc via method to_proc lalu bagaimana dengan &:method misalnya &:to_i ?

Hmmm..

Kalau seperti contoh kita tadi &Foo.new memiliki arti memanggil to_proc dari objek kelas Foo berarti &:to_i adalah memanggil to_proc dari kelas Symbol.

Yap, :to_i adalah objek dari kelas Symbol.

Apa yang terjadi kalau objek kelas Symbol memanggil to_proc ?, kita cek saja kali ini menggunakan simbol :reverse.

Wow ternyata kode di atas sama hasilnya dengan

Jadi, jika diterjemahkan maka "1 2 3".split.map(&:to_i) adalah seperti ini

Gak heran dong kenapa hasilnya bisa 1, 2 dan 3 karena sama saja dengan "1".to_i, "2".to_i dan "3".to_i

Sekarang gimana sih isi dari to_proc yang dimiliki kelas Symbol yang bisa membuat :reverse.to_proc.call('dibalik') sama dengan 'dibalik'.reverse atau juga :to_i.to_proc.call("1") bisa sama dengan "1".to_i ?

Jawabannya adalah kurang lebih seperti ini.

Ketika proc dari simbol dipanggil dengan call beserta parameternya misal ‘dibalik’ maka yang terjadi adalah menjadi 'dibalik'.send(self). Siapa itu self?. Ya objek dari kelas itu sendiri, kalau :reverse berarti menjadi 'dibalik'.send(:reverse) dan yang terkahir ini adalah sama saja dengan 'dibalik'.reverse.

Semoga tulisan ini mencerahkan dan mari kita berdiskusi jika kamu ada pertanyaan atau koreksi 😉

Happy hacking!

Facebook Comments
 

Agung Setiawan

Agung Setiawan adalah software engineer di BukaLapak.com, penulis sekaligus pecinta sastra, dan pembaca buku

 
Halo, perkenalkan saya Agung Setiawan.
Saya Software Engineer di BukaLapak.
Simak pemikian saya soal dunia Software Engineering via Twitter di @agungsetiawanmu dan facebook
Blog ini saya update seminggu sekali jadi sering-sering saja mampir
Mau belajar Vim bareng saya?
Belajar ngoding dari nol menggunakan PHP

Leave a Reply

Your email address will not be published. Required fields are marked *