Hello Metaprogramming

Yuk... kini saatnya kita mempraktekan teknik metaprogramming. Semacam aplikasi 'hello world' gitu deh. Saya asumsikan komputer anda telah ter-install Interpreter Ruby (saya menggunakan Ruby 1.8.6). Saya juga mengasumsikan pembaca telah menguasai dasar-dasar bahasa pemrograman Ruby. Silahkan salin code di bawah ini menggunakan teks editor kesayangan anda kemudian beri nama manusia.rb

class Manusia
def self.umpat(bahasa, umpatan)
class_eval "def mengumpat_dalam_bahasa_#{bahasa}; puts '#{umpatan}'; end"
end
umpat("inggris", "Shit!")
umpat("jawa", "Jancok!")
end


Simpan file tersebut di lokasi favorit anda dan jalankan program irb di lokasi yang sama (melalui console). Kemudian ikuti langkah-langkah berikut ini pada irb anda:

irb(main):001:0> require 'manusia.rb'
=> true
irb(main):002:0> saya = Manusia.new
=> #
irb(main):003:0> saya.mengumpat_dalam_bahasa_inggris
Shit!
=> nil
irb(main):004:0> saya.mengumpat_dalam_bahasa_jawa
Jancok!
=> nil


Sampai di sini, kita telah melakukan metaprogramming sederhana. Dimana letak unwritten code-nya? Kita tidak pernah menulis method mengumpat_dalam_bahasa_inggris dan mengumpat_dalam_bahasa_jawa secara eksplisit, tapi kita bisa memanggilnya. Dari mana gerangan dia berasal? Inilah salah satu contoh "magic" yang ada dalam metaprogramming. Rahasianya ada di method ini:

class_eval "def mengumpat_dalam_bahasa_#{bahasa}; puts '#{umpatan}'; end"


Selalu ingat bahwa code is data, data is code. Berkat method class_eval, String yang terdapat pada method class_eval dieksekusi layaknya code walaupun kita tahu bahwa String yang "normal" itu adalah data bukan code yang harus dieksekusi oleh interpreter.

Sekarang kita menginginkan supaya manusia bisa mengumpat dalam bahasa Indonesia? Bagaimana caranya? Jangan tutup console irb anda, kita lanjutkan yang tadi:

irb(main):005:0> Manusia.umpat('indonesia','Kampret!')
=> nil
irb(main):006:0> saya.mengumpat_dalam_bahasa_indonesia
Kampret!
=> nil


Yay.. sekarang manusia bisa mengumpat dalam bahasa Indonesia. Hal ini dimungkinkan karena pada bahasa Ruby, class selalu terbuka (open). Kapanpun kita bisa menambahkan atribut ke dalam class yang kita inginkan.

4 komentar:

phiandkit mengatakan...

mas klo mo blajar ruby dasaranya apa???

bingung bahasanya

agionagile mengatakan...

yang jelas harus paham konsep object-oriented programming dulu.

untuk bahasanya udah banyak tutorial di internet, salah satunya yg paling bagus http://poignantguide.net

salah satu buku ruby yg gratis jg bisa didapat di http://infoq.com

dudu mengatakan...

Huhui. Satu lagi orang yang belajar Ruby. Saya yakin bakal menjadi Bahasa Yang Paling Kuat suatu hari nanti.
Selamat ber - Ruby ria.
Saya juga masih belajar ko.
Are you Aremania?

agionagile mengatakan...

yes i am