Pengenalan Ruby

25
Sejarah Ruby adalah bahasa pemrogaman scripting yang berorientasi objek. Tujuan dari ruby adalah menggabungkan kelebihan dari semua bahasa pemrogaman scripting yang ada di dunia. Ruby ditulis dengan bahasa C dengan kemampuan dasar seperti Perl dan Phyton. Ruby pertama kali dibuat oleh seorang programmer Jepang bernama Yukihiro Matsumoto. Penulisan Ruby dimulai pada February 1993 dan pada Desember 1994 dirilis versi alpha dari ruby. Pada awal perkembangan Ruby, Yukihiro meulis Ruby sendiri sampai pada tahun 1996 terbentuk komunitas Ruby yang banyak mengkotribusikan Ruby. Ruby merupakan bahasa yang seimbang. Pencipta Ruby, Yukihiro “matz” Matsumoto , menggabungkan bagian-bagian dari bahasa-bahasa favorit beliau (Perl, Smalltalk, Eiffel, Ada dan Lisp) untuk membentuk bahasa baru yang seimbang antara pemrograman fungsional dengan pemrograman imperatif. Matz sering menyebutkan bahwa beliau sedang “mencoba membuat Ruby natural, bukan sederhana,” dengan cara membuatnya mirip dengan kehidupan nyata. Berprinsip pada hal ini, Matz menambahkan: Penampilan Ruby dari luar sederhana, tetapi sangat rumit di bagian dalam, seperti badan manusia kita ini. Perkembangan Ruby Sejak Ruby pertama kali dirilis ke publik pada tahun 1995, banyak programmer profesional dari seluruh dunia serius ikut mengembangkan Ruby. Pada tahun 2006, Ruby diterima oleh banyak orang. Dengan komunitas pengguna Ruby yang aktif di banyak kota- kota di seluruh dunia dan konferensi-konferensi beserta pertemuan Ruby terkait.

Transcript of Pengenalan Ruby

Page 1: Pengenalan Ruby

SejarahRuby adalah bahasa pemrogaman scripting yang berorientasi objek. Tujuan dari ruby adalah menggabungkan kelebihan dari semua bahasa pemrogaman scripting yang ada di dunia. Ruby ditulis dengan bahasa C dengan kemampuan dasar seperti Perl dan Phyton.

Ruby pertama kali dibuat oleh seorang programmer Jepang bernama Yukihiro Matsumoto. Penulisan Ruby dimulai pada February 1993 dan pada Desember 1994 dirilis versi alpha dari ruby. Pada awal perkembangan Ruby, Yukihiro meulis Ruby sendiri sampai pada tahun 1996 terbentuk komunitas Ruby yang banyak mengkotribusikan Ruby.

Ruby merupakan bahasa yang seimbang. Pencipta Ruby, Yukihiro “matz” Matsumoto, menggabungkan bagian-bagian dari bahasa-bahasa favorit beliau (Perl, Smalltalk, Eiffel, Ada dan Lisp) untuk membentuk bahasa baru yang seimbang antara pemrograman fungsional dengan pemrograman imperatif.

Matz sering menyebutkan bahwa beliau sedang “mencoba membuat Ruby natural, bukan sederhana,” dengan cara membuatnya mirip dengan kehidupan nyata.

Berprinsip pada hal ini, Matz menambahkan:

Penampilan Ruby dari luar sederhana, tetapi sangat rumit di bagian dalam, seperti badan manusia kita ini.

Perkembangan RubySejak Ruby pertama kali dirilis ke publik pada tahun 1995, banyak programmer profesional dari seluruh dunia serius ikut mengembangkan Ruby. Pada tahun 2006, Ruby diterima oleh banyak orang. Dengan komunitas pengguna Ruby yang aktif di banyak kota-kota di seluruh dunia dan konferensi-konferensi beserta pertemuan Ruby terkait.

Ruby-Talk, milis utama untuk diskusi Ruby (dalam bahasa Inggris) telah mencapai kisaran 200 email setiap hari.

TIOBE index, yang menghitung perkembangan bahasa-bahasa pemrograman, menempatkan Ruby pada peringkat ke 10 diantara bahasa-bahasa pemrograman di seluruh dunia. Melihat pada

Page 2: Pengenalan Ruby

perkembangan ini, mereka memperkirakan, “Kesempatan Ruby memasuki peringkat atas 10 besar adalah dalam waktu setengah tahun.” Kebanyakan dari perkembangan Ruby beratribut pada terkenalnya software yang ditulis dengan Ruby, terutama framework web Ruby on Rails2.

Ruby juga sepenuhnya bebas. Tidak hanya gratis, tetapi juga bebas untuk menggunakan, memodifikasi dan mendistribusikan Ruby.

Setitik Cerita Tentang RubyMelihat Semua sebagai Obyek

Pertama kali, Matz melihat bahasa-bahasa lain untuk mencari sintaks yang ideal. Terkenang pencariannya, Matz berkata, “Saya mau bahasa scripting yang lebih hebat daripada Perl dan lebih berorientasi obyek daripada Python3.”

Di Ruby, semua adalah obyek. Setiap informasi dan kode bisa diberi property dan action. Pemrograman berorientasi obyek memanggil property dengan nama variabel instan dan action, yang disebut sebagai metode. Pendekatan murni berorientasi obyek terutama terlihat pada demonstrasi sedikit kode yang diberikan pada number.

5.times { print "Kami *cinta* Ruby -- Ruby sungguh aduhai!" }

Di banyak bahasa-bahasa lain, number dan tipe primitif bukan obyek. Ruby mengikuti pengaruh bahasa Smalltalk dengan memberikan metode dan variabel instan pada semua tipe. Ini memudahkan menggunakan Ruby, karena peraturan-peraturan mengenai obyek semua berlaku pada Ruby.

Ruby Fleksibel

Ruby dianggap sebagai bahasa yang fleksibel, karena bagian-bagian dari Ruby bisa diubah-ubah dengan bebas. Bagian-bagian yang esensi di Ruby bisa dihapus maupun didefinisikan ulang. Bagian-bagian yang sudah ada bisa ditambahkan. Ruby mencoba untuk tidak membatasi programmer.

Misalnya, penambahan dilakukan dengan operator plus (+). Tetapi, jika Anda ingin menggunakan kata plus yang lebih mudah dibaca, maka Anda dapat menambahkan metode tersebut pada kelas builtin Numeric.

class Numeric  def plus(x)    self.+(x)  endend

Page 3: Pengenalan Ruby

y = 5.plus 6# y sekarang adalah 11

Demi kemudahan, operator-operator Ruby adalah juga metode. Anda juga bisa mendefinisikan ulang operator.

Blok, Fitur yang sungguh Ekspresif

Blok Ruby juga dianggap sebagai sumber kekuatan Ruby yang sangat fleksibel. Programmer dapat menyertakan closure pada setiap metode, menjelaskan bagaimana metode yang bersangkutan seharusnya berperilaku. Closure disebut blok dan telah menjadi satu diantara banyak fitur-fitur Ruby yang paling populer pada banyak pendatang baru Ruby dari bahasa-bahasa imperatif lain seperti PHP atau Visual Basic.

Blok terinspirasi dari bahasa-bahasa fungsional. Matz berkata, “Saya ingin menghormati kultur Lisp di closure Ruby4.”

search_engines =   %w[Google Yahoo MSN].map do |engine|    "http://www." + engine.downcase + ".com"  end

Pada kode diatas, blok dijelaskan dalam bentuk do ... end. Metode map memberlakukan blok agar menerima array kata-kata (Google, Yahoo dan MSN). Banyak metode-metode lain di Ruby dibiarkan mempunyai hole yang dibuka untuk programmer agar menulis blok mereka sendiri untuk mengisi dengan lebih lengkap apa saja yang seharusnya sebuah metode lakukan.

Ruby dan Mixin

Tidak seperti banyak bahasa-bahasa berorientasi obyek lain, Ruby hanya menyediakan single inheritance dengan sengaja. Tetapi Ruby mengetahui konsep module (disebut sebagai Categories di Objective-C). Module merupakan kumpulan dari metode-metode.

Kelas dapat me-mixin (menggabungkan) sebuah module dan menerima semua metode-metode (dari module yang bersangkutan) dengan bebas. Contoh, setiap kelas yang mengimplementasikan metode each bisa mixin module Enumerable, yang menambahkan banyak metode-metode yang menggunakan each untuk melakukan perulangan.

class MyArray  include Enumerableend

Secara umum, Rubyist menganggap ini sebagai cara yang lebih jelas ketimbang multiple inheritance, yang rumit dan bahkan terlalu membatasi.

Tampilan Ruby secara Visual

Page 4: Pengenalan Ruby

Ruby jarang menggunakan tanda baca dan biasanya cenderung menggunakan keyword berbahasa Inggris, biasanya beberapa tanda baca digunakan untuk memperjelas kode Ruby

Ruby tidak perlu deklarasi variabel. Ruby menggunakan aturan penamaan yang mudah untuk menyatakan scope suatu variabel.

var adalah variabel lokal. @var adalah variabel instan. $var adalah variabel global.

Sigil-sigil tersebut bertujuan untuk memudahkan dan memperjelas ketika dibaca bagi programmer untuk mengidentifikasi fungsi dari setiap variabel. Sigil juga bisa menjadi hal yang tidak perlu bila harus digunakan pada setiap member instan self.

Langkah Selanjutnya

Ruby kaya fitur, antara lain sebagai berikut:

Ruby memiliki fitur-fitur yang menangani exception, seperti Java atau Python, untuk mempermudah menangani error.

Ruby menyediakan mark-and-sweep garbage collector untuk semua obyek Ruby. Tidak perlu me-maintain reference count pada library extension. Seperti yang Matz katakan, “Ini lebih baik untuk kesehatan Anda.”

Menulis extension C di Ruby lebih mudah daripada di Perl ataupun di Python, dengan API yang elegan untuk memanggil Ruby dari C. Ini termasuk memanggil Ruby embedded di software, untuk digunakan sebagai bahasa scripting. Interface SWIG juga tersedia.

Ruby bisa load library extension secara dinamis jika Sistem Operasi mengijinkan.

Ruby menyediakan fitur OS threading yang independent. Maka, untuk semua platform dimana Ruby berjalan, Anda juga punya multithreading, terlepas dari apakah Sistem Operasi mendukung multithreading atau tidak, bahkan pada MS-DOS sekalipun!

Ruby sangat portable: Ruby kebanyakan dikembangkan di GNU/Linux, tetapi juga berjalan di banyak tipe UNIX, Mac OS X, Windows 95/98/Me/NT/2000/XP, DOS, BeOS, OS/2, dan lain-lain.

Fitur-Fitur Penting dan Yang Perlu Diperhatikan Ruby

Berikut adalah beberapa penjelasan dan petunjuk pada fitur-fitur utama Ruby yang akan Anda lihat ketika sedang mempelajari Ruby.

Page 5: Pengenalan Ruby

Iteration

Dua fitur Ruby yang mungkin belum biasa Anda lihat sebelumnya adalah “blok” dan iterator. Daripada melakukan perulangan dengan indeks (seperti C, C++ ataupun Java sebelum versi 1.5), atau melakukan perulangan lewat list (seperti for (@a) {...} di Perl ataupun for i in aList: ... di Python). Anda akan sangat sering melihat kode yang mirip seperti ini di Ruby:

daftar_orang.each do |orang_ini|  # Kita berada dalam blok  # Kita sedang berurusan dengan orang_ini  # orang_ini disebut parameter blok  puts orang_ini.namaend

Untuk info lebih lanjut tentang each (dan teman-temannya seperti collect, find, inject, sort, dan lain-lain.), lihat ri Enumerable (kemudian ri Enumerable#func_name).

Semua Mempunyai Nilai

Tidak ada perbedaan antara ekspresi dan pernyataan. Semua punya value (nilai), bahkan jika value tersebut adalah nil (maksudnya, nil juga tetap punya value). Ini karena:

x = 10y = 11z = if x < y  trueelse  falseendz # => true

Symbol Bukan String

Banyak Rubyist pemula berjuang keras memahami apa itu Symbol dan untuk apa Symbol itu ada.

Symbol dapat dijelaskan sebagai identitas. Symbol merupakan sebuah hal tentang siapa ini, bukan apa ini. Buka irb dan perhatikan perbedaan berikut ini:

irb(main):001:0> :joko.object_id == :joko.object_id=> trueirb(main):002:0> "joko".object_id == "joko".object_id=> falseirb(main):003:0>

Metode object_id mengembalikan identitas dari sebuah Object. Jika ada dua obyek memiliki object_id yang sama, maka mereka sebenarnya adalah obyek yang sama (menunjuk ke Object yang sama di memori).

Page 6: Pengenalan Ruby

Seperti yang dapat Anda lihat, sekali Anda pernah menggunakan Symbol, setiap Symbol dengan karakter yang sama menunjuk ke Object yang sama di memori. Untuk setiap dua Symbol yang merepresentasikan karakter yang sama, maka object_id cocok.

Sekarang perhatikan String (“joko”). object_id tidak cocok. Artinya dua obyek tersebut menunjuk ke dua obyek yang berbeda di memori, meskipun isi kedua obyek String tersebut sama persis. Kapanpun Anda menggunakan String baru, Ruby selalu mengalokasikan memory untuk string baru tersebut.

Jika Anda ragu-ragu apakah menggunakan Symbol atau String, pertimbangkanlah apa saja yang lebih penting: identitas obyek (contoh: key Hash), atau isi (seperti contoh di atas, “joko”).

Semua adalah Obyek

“Semua adalah obyek” bukan sekedar hiperbola. Bahkan kelas (Class) dan integer juga obyek, dan Anda dapat melakukan hal yang sama seperti perlakuan Anda terhadap obyek-obyek lain:

# Ini sama saja dengan# class KelasSaya# attr_accessor :variabel_instan# endKelasSaya = Class.new do  attr_accessor :variabel_instanend

Konstanta

Konstanta bisa diubah. Jika Anda mengubah konstanta yang sudah diinisialisasi, maka akan menyebabkan warning, tetapi tidak sampai menghentikan program Anda. Jadi maksudnya Anda seharusnya tidak mendefinisikan ulang konstanta.

Pengaturan Penamaan

Ruby memiliki pengaturan penamaan. Jika sebuah identifier diawali dengan huruf kapital, maka identifier tersebut merupakan konstanta. Jika identifier diawali dengan tanda dolar ($), maka identifier tersebut adalah variabel global. Jika identifier diawali dengan tanda @, maka identifier tersebut adalah instance variable. Jika identifier diawali dengan @@, maka identifier tersebut adalah variabel kelas.

Tetapi, nama-nama metode boleh diawali dengan huruf kapital. Ini bisa membingungkan, seperti ditunjukkan pada contoh berikut:

Konstanta = 10def Konstanta  11end

Sekarang Konstanta adalah 10, tetapi Konstanta() adalah 11.

Page 7: Pengenalan Ruby

Fake Keyword Parameters

Ruby tidak memiliki keyword parameters atau parameter bernama, seperti Python. Tetapi, ini bisa dimanipulasi (fake) dengan cara menggunakan symbol dan hash. Ruby on Rails, satu diantara banyak aplikasi yang dibuat dengan Ruby, banyak menggunakan trik ini. Contoh:

def keluarkan( params )  paramsend

keluarkan( :param_satu => 10, :param_dua => 42 )

# => {:param_satu=>10, :param_dua=>42}

Ini dikarenakan Ruby otomatis mengubah parameter yang diberikan tersebut menjadi bentuk hash. (meskipun pemanggilannya tanpa menggunakan kurung kurawal yang merupakan sintaks hash)

Nilai True bersifat Universal

Di Ruby, semua (kecuali nil dan false) dianggap true. Di C, Python dan banyak bahasa lain, 0 dan mungkin juga nilai-nilai lain, seperti list yang kosong, dianggap false. Perhatikan kode Python berikut (contoh berikut juga berguna untuk bahasa-bahasa lain):

# di Pythonif 0:  print "0 is true"else:  print "0 is false"

Ini akan print “0 is false”. Kode yang sama di Ruby:

# di Rubyif 0  puts "0 is true"else  puts "0 is false"end

Print “0 is true”.

Access Modifier Berlaku Sampai Akhir Scope

Pada kode Ruby berikut ini,

class KelasSaya  private  def metode; true; end  def metode_lain; false; endend

Page 8: Pengenalan Ruby

Anda mungkin berharap metode_lain adalah public. Tetapi tidak demikian. Access modifier private bersambung terus sampai akhir scope, atau sampai access modifier lain muncul, apapun yang muncul lebih awal. Secara default, metode bersifat public:

class KelasSaya  # Sekarang metode adalah public  def metode; true; end

  private

  # metode_lain adalah private  def metode_lain; false; endend

public, private dan protected benar-benar merupakan metode, sehingga mereka bisa menerima parameter. Jika Anda melewatkan Symbol pada satu dari parameter, maka visibility metode diubah.

Akses Metode

Di Java, public berarti metode bisa diakses oleh siapa saja. protected berarti instance kelas, instance dari kelas-kelas turunan, dan instance dari kelas-kelas package yang sama dapat mengakses, tetapi tidak untuk yang lain, dan private berarti tidak ada yang dapat mengakses metode kecuali instance kelas.

Di Ruby, public secara natural adalah public. private berarti metode hanya bisa diakses ketika metode bisa dipanggil tanpa obyek penerima yang eksplisit. Hanya self yang boleh menjadi receiver pemanggilan metode private.

protected perlu diperhatikan lebih lanjut. Metode protected bisa dipanggil dari kelas ataupun instance kelas turunan, tetapi juga dengan instance lain sebagai penerima.

Contoh, diadaptasi dari Ruby FAQ:

$ irbirb(main):001:0> class Testirb(main):002:1> # metode berikut secara default adalah publicirb(main):003:1* def funcirb(main):004:2> 99irb(main):005:2> endirb(main):006:1> irb(main):007:1* def ==(other)irb(main):008:2> func == other.funcirb(main):009:2> endirb(main):010:1> end=> nilirb(main):011:0> irb(main):012:0* t1 = Test.new=> #<Test:0x34ab50>irb(main):013:0> t2 = Test.new=> #<Test:0x342784>irb(main):014:0> t1 == t2

Page 9: Pengenalan Ruby

=> trueirb(main):015:0> # sekarang atur `func` menjadi protected, irb(main):016:0* # masih jalan karena protected bisa reference ke lainirb(main):017:0* class Testirb(main):018:1> protected :funcirb(main):019:1> end=> Testirb(main):020:0> t1 == t2=> trueirb(main):021:0> # sekarang atur `func` menjadi privateirb(main):022:0* class Testirb(main):023:1> private :funcirb(main):024:1> end=> Testirb(main):025:0> t1 == t2NoMethodError: private method `func' called for #<Test:0x342784>        from (irb):8:in `=='        from (irb):25        from :0irb(main):026:0>

Kelas Bersifat Terbuka

Kelas Ruby bersifat terbuka. Anda bisa membuka Class, lalu menambahkan ke dalam Class, dan menggantinya kapan saja. Bahkan kelas yang termasuk class inti, seperti kelas Fixnum atau bahkan kelas Object, induk dari semua obyek di Ruby. Ruby on Rails mendefinisikan banyak metode yang berhubungan dengan waktu ke dalam kelas Fixnum. Perhatikan kode berikut:

class Fixnum  def hours    self * 3600 # total detik dalam satu jam adalah 3600  end  alias hour hoursend  # 14 hours from 00:00 January 1st# jadi 14 jam dari jam 00:00 pada tanggal 1 JanuariTime.mktime(2007, 01, 01) + 14.hours # => Sun Jan 01 14:00:00

Nama Metode Deskriptif dan Menarik

Di Ruby, metode boleh diakhiri dengan tanda tanya ataupun tanda seru. Pengaturan nama adalah, metode-metode yang menjawab pertanyaan (seperti Array#empty? mengembalikan nilai true jika obyek penerima yaitu Array ternyata kosong) diakhiri dengan tanda tanya. Kemudian, metode-metode yang berpotensi untuk “membahayakan” (seperti metode yang mengganti self atau argumen, exit! dan lain sebagainya) maka pengaturannya diakhiri dengan tanda seru.

Tetapi, semua metode yang mengganti argument tidak diakhiri dengan tanda seru. Array#replace mengganti isi array dengan isi array lain. Karena tidak masuk akal kalau ada metode sedemikian rupa tidak mengganti self.

Page 10: Pengenalan Ruby

Metode Singleton

Metode singleton merupakan metode-metode yang basisnya per obyek. Singleton hanya tersedia pada obyek yang Anda definisikan, jadi metode tersebut tidak tersedia pada obyek-obyek yang lain dari kelas yang sama.

class Mobil  def inspect    "Mobil murah"  endend

porsche = Mobil.newporsche.inspect # => Mobil murahdef porsche.inspect  "Mobil mahal"end

porsche.inspect # => Mobil mahal

# Sementara obyek-obyek yang lain tidak terpengaruhmobil_lain = Mobil.newmobil_lain.inspect # => Mobil murah

Metode method_missing

Ruby tidak menyerah kalau Ruby tidak mendapatkan metode yang bisa menanggapi message tertentu. Ruby akan memanggil metode method_missing dengan nama metode yang Ruby tidak ditemukan beserta daftar parameternya. Secara default, method_missing membangkitkan exception NameError, tetapi Anda bisa mendefinisikan ulang Exception tersebut supaya lebih sesuai dengan aplikasi yang Anda buat, dan banyak library yang melakukan hal yang sama. Contoh:

# id adalah nama metode yang dipanggil, # sintaks * mengumpulkan semua arguments# dalam array yang bernama 'arguments'def method_missing( id, *arguments )  puts "Metode #{id} telah dipanggil, " +     "tetapi tidak ditemukan. " +    "Metode ini punya arguments sebagai berikut: " +    arguments.join(", ")end

__ :a, :b, 10

# => Metode __ telah dipanggil, tetapi metode __ # tidak berhasil ditemukan. Metode tersebut # memiliki argument sebagai berikut: a, b, 10

Kode diatas hanya print detil tentang pemanggilan (call), tetapi Anda bisa dengan bebas menangani message dengan cara ini.

Page 11: Pengenalan Ruby

Melewatkan Message, Bukan Pemanggilan function

Pemanggilan metode adalah sungguh-sungguh merupakan message ke obyek lain:

# Penambahan ini1 + 2# adalah sama dengan penambahan ini ...1.+(2)# juga sebetulnya sama dengan penambahan ini :1.send "+", 2

Blok Bisa Diubah Menjadi Sebuah Object

Blok (closure) banyak digunakan oleh library Ruby standar. Untuk memanggil blok, Anda bisa menggunakan yield, atau membuat sebuah obyek Proc dengan menambahkan argumen khusus pada list argument, seperti contoh berikut:

def blok( &the_block )  # Di dalam sini, the_block adalah blok yang dilewatkan ke metode blok  the_block # return the blockendadder = blok { |a, b| a + b }# adder sekarang merupakan obyek Procadder.class # => Proc

Anda juga dapat membuat blok diluar pemanggilan metode dengan memanggil Proc.new dengan blok atau pemanggilan metode lambda.

Ketika dibuat metode juga merupakan Object.

method(:puts).call "puts adalah obyek!"# => puts adalah obyek!

Operator adalah Syntactic Sugar

Kebanyakan operator di Ruby hanyalah syntactic sugar. Maksudnya syntactic sugar adalah penyingkatan penulisan kode. Dalam hal operator-operator itu, mereka sebenarnya hanyalah pemanggilan metode saja, tentunya dengan peraturan tertentu supaya jenjang precedence tetap dituruti. Contohnya, Anda bisa meng-override metode + milik kelas Fixnum:

class Fixnum  # Sebenarnya Anda bisa melakukan ini,   # tetapi tolong jangan lakukan ini  def +( other )    self - other  endend

Anda tidak membutuhkan operator+ C++, dan seterusnya.

Page 12: Pengenalan Ruby

Anda bahkan juga bisa mempunyai akses style array jika Anda mendefinisikan metode [] dan []=. Untuk mendefinisikan unary + dan – (bayangkan +1 dan -2), Anda harus mendefinisikan metode +@ dan -@.

Tetapi operator-operator dibawah ini bukan syntactic sugar. Operator-operator dibawah ini bukan metode dan tidak dapat didefinisikan ulang:

=, .., ..., !, not, &&, and, ||, or, !=, !~, ::

Tambahan, +=, *= dan lain sebagainya hanyalah singkatan untuk var = var + var_lain, var = var * var_lain, dan seterusnya tidak dapat didefinisikan ulang.

ALASAN MENGAPA BANYAK YANG MEMAKAI RUBY

1. Ruby Berorientasi Objek. Ini apa artinya? Jika ada sepuluh programmer, maka akan ada dua belas opini tentang apa itu Pemrograman Berorientasi Objek. Saya tinggalkan semua itu pada kebijakan Anda. Dalam hal ini, Ruby menawarkan enkapsulasi data dan metode pada objek-objek dan penurunan dari satu kelas ke kelas lain; Ruby juga ada objek polimorfisme. Tidak seperti C++, Perl 5, dan bahasa-bahasa pemrograman lain, Ruby didesain berorientasi objek dari awal.

2. Ruby murni merupakan Bahasa Pemrograman Berorientasi Objek. Mengapa saya jadi berlebihan? Tidak juga. Yang saya maksud dengan mengatakan bahwa Ruby merupakan Bahasa Pemrograman Berorientasi Objek adalah semua di Ruby dianggap sebagai objek, termasuk tipe data primitif seperti string dan integer. Sehingga kelas-kelas wrapper seperti Java tidak diperlukan. Tambahan, bahkan konstanta pun diperlakukan sebagai objek, sehingga, misalkan, metode yang dibangkitkan lewat konstanta numerik itu merupakan receiver.

3. Ruby merupakan Bahasa yang dinamis. Bagi orang-orang yang sudah terbiasa dengan bahasa-bahasa statik seperti C++ dan Java, konsep dinamis ini merupakan hal yang signifikan. Artinya metode-metode dan variabel-variabel dapat ditambahkan dan didefinisikan ulang pada saat runtime. Ruby menghapus segala kesulitan atas kewajiban fitur-fitur seperti kompilasi kondisi C (#ifdef), Ruby juga memungkinkan pembuatan API otomatis. Ini menjadikan program-program lebih “mengerti”—Ruby memungkinkan program mengetahui informasi tipe saat runtime, mampu mendeteksi metode yang terlewat (tambahan penerjemah, metode yang tidak didefinisikan sebelumnya ataupun terlewati), dan sebagainya. Dengan perilaku ini Ruby erat kaitannya dengan Lisp dan Smalltalk.

4. Ruby merupakan bahasa interpreted. Bahasan mengenai bahasa interpreted ini memang masalah kompleks dan layak dikomentari. Bahasa interpreted sering diperdebatkan karena memiliki masalah negatif tentang performance. Saya menjawab argumen negatif tersebut dengan observasi sebagai berikut: Pertama, dan yang paling penting: Proses Pengembangan yang sangat cepat merupakan hal menguntungkan, ini dipicu oleh bahasa Ruby yang alami interpreted. Kedua, sebetulnya seberapa lambatkah yang dinamakan terlalu lambat? Apakah Anda sudah

Page 13: Pengenalan Ruby

melakukan benchmark sebelum Anda berkata kalau Ruby itu lambat. Ketiga, Walau beberapa orang akan mengkritik saya, saya tetap akan mengatakan ini: prosesor-prosesor komputer setiap tahun berkembang semakin cepat. Keempat, jika Anda benar-benar membutuhkan kecepatan, Anda dapat menulis sebagian kode program Anda dalam bahasa C. Kelima, terakhir dan ini merupakan hal yang diperdebatkan, karena tidak ada bahasa yang yang secara permanen interpreted. Tidak ada aturan di dunia ini yang mengatakan bahwa Ruby compiler tidak dapat ditulis.

5. Ruby mengerti Regexp. Kemampuan UNIX akan grep dan sed atau melakukan operasi cari-dan-ganti dengan vi sudah dikenal sejak bertahun-tahun. Perl banyak membantu perubahan tersebut, begitu pula dengan Ruby. Banyak orang yang mengetahui kehebatan teknik string tingkat mahir dan manipulasi teks. Untuk yang ragu-ragu silakan pergi dan baca buku Jeffrey Friedl yang berjudul Mastering Regular Expressions. Jadi seharusnya tidak akan ada lagi yang ragu-ragu.

6. Ruby bisa dijalankan di banyak platform. Ruby bisa dijalankan di Linux dan varian-varian UNIX lainnya, di Windows, BeOS, dan bahkan di MS-DOS. Kalau tidak salah ingat, bahkan Ruby juga tersedia untuk platform Amiga.

7. Basis Ruby bersumber dari banyak sumber. Apakah ini baik? Diluar dunia tulis-menulis, ya. Isaac Newton pernah berkata, “Jika saya sudah melihat yang lain melakukan hal yang lebih jauh, itu karena saya berdiri di atas pundak para raksasa.” Jelas Ruby berdiri di atas pundak raksasa. Ruby meminjam fitur-fitur dari Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell, dan lain-lain. Hal yang prinsip, yang saya lihat di saat kerja adalah: Pertama, Jangan menjadi penemu akan hal-hal yang sudah ada (jangan reinvent the wheel). Kedua, Jangan perbaiki hal-hal yang tidak rusak. Ketiga, terakhir dan ini yang spesial, gunakan keahlian-keahlian yang sudah ada pada orang-orang. Anda sudah mengerti operasi file dan pipe di UNIX? Bagus, Anda bisa menggunakan keahlian tersebut. Anda telah menghabiskan waktu Anda selama 2 tahun mempelajari semua hal tentang printf? Jangan khawatir, Anda bisa menggunakan printf. Anda mengerti Regexp di Perl? Bagus, berarti sebetulnya Anda hampir sudah belajar Ruby.

8. Ruby dikembangkan dengan inovatif. Apakah poin 8 ini berlawanan dengan poin ke 7 diatas? Sebagian, ya. Setiap koin mempunyai dua sisi. Beberapa fitur Ruby benar-benar inovatif, seperti konsep mix-in yang sangat berguna. Mungkin beberapa fitur tersebut dipinjam dari bahasa-bahasa masa depan (Catatan: Seorang pembaca telah menunjukkan kepada saya bahwa LISP punya mix-in paling tidak sejak tahun 1979. Bukan berarti saya tidak peduli akan argumen saya, tapi saya akan menemukan contoh yang lebih baik dan membuat Anda yakin bahwa Ruby dikembangkan dengan inovatif.)

9. Ruby merupakan Bahasa Laras yang Sangat Tinggi (Very High-Level Language). Penggunaan terminologi Very High-Level Language ini memang diperdebatkan, karena terminologi tersebut tidak digunakan secara luas sehingga menjadi bahan perdebatan daripada konsep Pemrograman Berorientasi Objek sendiri. Ketika saya mengatakan ini, yang saya maksud adalah Ruby mampu menangani struktur data kompleks dan operasi kompleks dengan sedikit perintah, sesuai dengan Filosofi Usaha yang minimal (untuk mendapatkan hasil maksimal).

Page 14: Pengenalan Ruby

10. Ruby memiliki Garbace Collector yang pintar. Routines seperti malloc dan free adalah mimpi buruk. Anda bahkan tidak perlu memanggil Destructor. Cukup sudah saya katakan ini.

11. Ruby merupakan bahasa scripting. Anda jangan keliru dengan berpikir Ruby tidak sehebat bahasa scripting. Ruby bukan mainan. Ruby merupakan bahasa yang dikembangkan secara total yang dibuat mudah untuk melakukan operasi-operasi biasa di scripting seperti menjalan program-program eksternal, memeriksa sumber daya (resource) sistem, menggunakan pipe, menangkap output, dan lain sebagainya.

12. Ruby adaptif terhadap banyak hal. Ruby dapat melakukan hal-hal seperti yang dilakukan Kornshell dan dapat melakukan berbagai tugas seperti yang dilakukan program C. Anda dapat menulis sepuluh baris program Ruby untuk melakukan penugasan/task, atau membuat wrapper untuk program-program legacy? Ruby bisa. Anda ingin menulis program server web, program CGI atau program catur? Lagi-lagi Ruby bisa melakukan itu semua.

13. Ruby bisa multi thread. Dengan Ruby, Anda dapat menulis aplikasi multi threaded dengan API sederhana. Ya, bahkan di lingkungan MS-DOS.

14. Kode-kode penyusun Ruby dibuka / Ruby itu open-source. Anda ingin melihat kode-kode penyusun Ruby? Silakan saja. Ingin merekomendasikan patch?. Ya silakan. Anda ingin bergabung dengan komunitas pengguna Ruby (Rubyist) yang pintar-pintar dan saling membantu termasuk pencipta Ruby itu sendiri? Anda bisa mendapatkan itu semua dalam nuansa Ruby. (Tambahan penerjemah: Komunitas Rubyist Internasional dapat Anda temui di http://groups.google.com/group/comp.lang.ruby dan Komunitas Rubyist Indonesia dapat Anda temui di http://groups.yahoo.com/groups/id-ruby)

15. Ruby itu intuitif. Kurva belajar Ruby itu landai, sekali Anda sudah terbiasa dengan Ruby, maka Anda akan mulai dapat menebak bagaimana suatu hal bekerja dengan Ruby… dan tebakan Anda sering benar. Ruby dirancang untuk mengikuti Prinsip Sedikit Kaget (Principle of Least Astonishment).

16. Ruby memiliki mekanisme exception. Ruby mengerti exception, seperti Java dan C++. Dengan kata lain, ini berarti output (hasil return coding) tidak akan berantakan, hanya ada lebih sedikit nested if (bila harus ada), lebih sedikit logika sederhana dan penanganan error yang lebih baik.

17. Ruby memiliki kelas Array tingkat mahir. Dalam Ruby, Array itu dinamis, Anda tidak perlu mendeklarasikan seberapa besar Array sewaktu di compile, sebut saja seperti di Pascal. Anda juga tidak perlu mengalokasikan memori buat Array seperti di C, C++ ataupun Java. Array merupakan objek, jadi Anda tidak perlu mengatur-atur/menjaga-jaga ukuran Array, untuk berjalan dari awal hingga akhir secara virtual adalah hal yang mustahil dilakukan seperti ketika Anda dengan C. Anda ingin memproses array berdasarkan indeks? Berdasarkan elemen? memproses array terbalik? mem print array? Semua itu sudah tersedia metode metode Array nya. Anda ingin menggunakan array sebagai set, stack dan queue (antrian) ? Untuk operasi tersebut juga sudah ada disediakan metode-metodenya. Anda ingin menggunakan array sebagai lookup

Page 15: Pengenalan Ruby

tabel? Eit nanti dulu, Itu sih pertanyaan menjebak, Anda tidak perlu repot-repot melakukan itu dengan array, karena kita punya hash untuk keperluan lookup tabel.

18. Ruby bisa di extend. Anda bisa menulis library eksternal dengan Ruby ataupun dengan C. Tambahan, bahkan Anda dapat memodifikasi kelas-kelas dan objek-objek yang sudah ada pada Ruby secara on the fly.

19. Ruby mendukung dokumentasi pemrograman. Anda dapat memasukkan komentar dalam kode-kode Ruby Anda yang mana tool dokumentasi Ruby dapat mengekstrak dan memanipulasi komentar Anda. (Para penggemar literate programming bahkan berpikir bahwa hal ini merupakan prinsip dasar yang harus ada).

20. Ruby secara kreatif menggunakan tanda-tanda dan kapitalisasi. Suatu metode yang menghasilkan output Boolean (walau Ruby tidak menyebutnya dengan cara demikian) biasa diakhiri dengan tanda tanya, dan metode yang destruktif atau metode yang dapat mengubah data biasanya diberi nama dengan tanda seru diakhir metode. Sederhana, informatif dan intuitif. Semua konstanta, termasuk nama kelas, diawali dengan huruf kapital. Semua atribut objek dimulai dengan tanda @ (akeong). Penggunaan tanda-tanda dan kapitalisasi ini merupakan konsep tua dari pragmatic programmer tanpa harus membuat mata lelah dan pusing kepala.

21. Tidak ada reserved words. Kita diperbolehkan menggunakan identifier yang disebut “reserved word” sepanjang parser tidak menganggapnya ambigu. Ini benar-benar seperti menghirup udara segar.

22. Ruby punya iterator. Dari sekian banyak hal, iterator memungkinkan kita untuk mem pass blok kode ke dalam objek Anda sehingga blok tersebut dipanggil pada setiap item di objek array, list, tree atau apa saja. Ini merupakan teknik dahsyat yang sangat baik untuk diexplorasi seluk-beluknya.

23. Ruby memiliki fitur-fitur sekuriti. Ruby meminjam konsep Perl yang menawarkan tingkat kontrol (tingkat paranoid?) dengan variabel $SAFE. Terutama berguna untuk program-program CGI yang ingin orang-orang lakukan untuk mengcrack server web.

24. Ruby tidak punya pointer. Seperti Java, dan (dengan sedikit mengangguk-nganggukkan kepala) juga dengan C++, Ruby tidak punya konsep pointer, tidak ada indirection, tidak ada pointer aritmetik, dan tidak ada pusing kepala dengan sintaks pointer dan debug pointer. Tentu, ini juga berarti menjadi penyebab pemrograman sistem menjadi lebih sulit, seperti mengakses register status kontrol untuk suatu device, tapi itu tetap bisa saja dijalankan dengan library C. (Seperti juga para programmer C turun derajat ke assembly jika diperlukan, begitu pula para programmer Ruby bisa saja turun ke C kalau memang diharuskan!)

25. Ruby memperhatikan sampai hal detil. Sinonim dan alias berkaitan erat. Anda tidak bisa mengingat yang mana size yang mana length untuk besar ataupun panjang suatu string atau array? Ya dua-duanya memang bisa jalan. Untuk range, ada begin dan end, ada juga first dan last? Ya terserah Anda mau pakai yang mana. Anda menyebut banyak index dengan indices, tapi

Page 16: Pengenalan Ruby

saudara kembar Anda menyebutnya indexes? Ya memang indices ataupun indexes dua-duanya bisa dipakai.

26. Ruby memiliki sintaks yang fleksibel. Kurung buka kurung tutup pada pemanggilan metode biasanya bisa dihilangkan, sama juga seperti koma di antara parameter-parameter. Quote gaya Perl juga bisa diberlakukan di array string tanpa perlu tanda quote dan koma. Keyword return bisa dihilangkan.

27. Ruby kaya akan library. Ruby mendukung thread, socket, limited object persistence, program CGI, server-side executables, file DB, dan banyak lagi. Ada juga dukungan untuk Tk, dan dukungan-dukungan lain untuk GUI.

28. Ruby punya debugger. Di dunia yang sempurna, kita tidak akan perlu debugger. Tapi dunia ini tidak sempurna.

29. Ruby bisa digunakan secara interaktif. Ruby dapat digunakan seperti menggunakan Kornshell. (Saya dipaksa untuk melaporkan bahwa Ruby tidak begitu bagus digunakan untuk shell, walaupun begitu, saya berpendapat shell yang berbasis Ruby itu akan bagus)

30. Ruby itu informatif. Tidak ada keyword yang boros seperti begin, then setelah if, do setelah while seperti di Pascal. Variabel-variabel tidak perlu dideklarasikan, sebab variabel memang tidak punya tipe. Tipe return tidak perlu ditentukan di metode. Keyword return tidak perlu ditulis, metode akan return untuk ekspresi yang dievaluasi terakhir. Dengan kata lain, Ruby tidak cryptic seperti C ataupun Perl.

31. Ruby itu ekspresif. Anda dapat dengan mudah mengatakan hal-hal seperti x = if a then b else c end

32. Tersedia sintaks yang memudahkan di Ruby. Jika Anda ingin meng iterate array x dengan mengatakan for a in x, Anda bisa. Jika Anda ingin mengatakan a += b daripada a = a + b, Anda juga bisa. Kebanyakan operator di Ruby sebetulnya merupakan metode yang singkat, nama-namanya intuitif dan sintaksnya nyaman.

33. Ruby punya overloading operator. Kalau tidak salah, aslinya dulu pernah di SNOBOL, tapi akhirnya dipopulerkan oleh C++. Ruby bisa saja disalahgunakan dan keliru, tapi Ruby memang indah memiliki fitur ini. Ruby mendefinisikan versi penugasan suatu operator secara otomatis; kalau Anda mendefinisikan +, Anda juga dapat bonus berupa +=

34. Ruby memiliki aritmetika integer yang presisi. Siapa yang peduli dengan short, int, long? Gunakan saja Bignum. Akui saja, Anda selalu ingin mencari factorial dari 365. Dan sekarang Anda bisa melakukan itu dengan mudah di Ruby.

35. Ruby punya operator eksponensial. Di zaman dahulu kala, kita menggunakan ini di BASIC dan FORTRAN. Tetapi kemudian kita belajar Pascal dan C, dan belajar betapa operator ini seperti setan. (Kita diberitahu bahwa kita tidak mengetahui bagaimana suatu evaluasi diselesaikan, apakah menggunakan logaritma? Iterasi? Seberapa efisien?) tetapi kemudian,

Page 17: Pengenalan Ruby

apakah kita betul-betul peduli? Jika iya, kita bisa saja menulis ulang sendiri. Tapi jika tidak, Ruby sudah punya operator tua yang bagus ** yang bisa Anda cinta sama seperti Anda mencintai anak Anda. Silakan dinikmati.

36. Ruby memiliki penanganan string yang hebat. Jika Anda ingin mencari, mengganti, mengatur format, membatasi, interprose ataupun token, semua itu bisa Anda lakukan dengan metode-metode Ruby yang sudah built-in. Kalau tidak ada, Anda tinggal membuatnya dengan mudah sesuai kebutuhan.

37. Ruby memiliki sedikit pengecualian pada aturan-aturan Ruby. Sintaks dan Semantik Ruby lebih konsisten ketimbang kebanyakan bahasa-bahasa lain. Setiap bahasa memiliki keanehan, dan setiap peraturan punya pengecualian, tetapi Ruby memiliki lebih sedikit pengecualian dari peraturan-peraturan daripada yang Anda harapkan.

Kemiripan Ruby dan Python

Page 18: Pengenalan Ruby

Sama dengan Python, di Ruby…

Ada Ruby Interaktif (dinamakan irb). Anda bisa membaca dokumentasi di command line (dengan ri, setara dengan pydoc di

Python). Tidak ada karakter khusus untuk akhir baris (newline biasa atau biasa kita sebut “enter”). Isi string bisa dipisah ke banyak baris seperti string triple-quoted di Python. Di Ruby hal

ini tidak membutuhkan sintaks khusus, cukup menggunakan petik tunggal atau petik ganda seperti biasanya, tapi Anda juga bisa menggunakan heredoc dan sintaks lain (misalnya %q{ halo }) jika Anda suka.

Buka kurung dan tutup kurung siku ([]) untuk list, buka kurung dan tutup kurung kurawal ({}) untuk hash (istilah Ruby untuk dict.)

Array mempunyai fungsionalitas yang sama. Menambahkan array menghasilkan array gabungan. Memasukkan array ke dalam array lain menghasilkan array bersarang atau nested array: a3 = [ a1, a2 ]

Obyek bersifat dinamis dan strongly typed. Semua adalah obyek, dan variabel hanya merupakan reference ke obyek. Meskipun keyword yang digunakan berbeda (Ruby menggunakan raise dan rescue),

fitur exception setara dengan Python. Anda mendapatkan fitur dokumentasi dalam kode (di Ruby disebut rdoc).

Perbedaan Ruby dan Python

Tidak seperti di Python, di Ruby…

String dapat diubah isinya (mutable.) Anda dapat membuat konstanta (variabel yang nilainya tidak akan diubah). Ada aturan penamaan (misalnya: nama kelas diawali dengan huruf kapital, nama variabel

lokal diawali dengan huruf kecil). Hanya ada satu jenis tipe kontainer yang berisi daftar data, yaitu Array. Array bersifat

mutable yaitu dapat diubah-ubah. Interpolasi string didukung menggunakan sintaks petik ganda. Interpolasi yang didukung

adalah escape sequence (misalnya \t untuk tab) dan substitusi ekspresi: "Selamat Datang, #{nama}!" akan menghasilkan string yang juga disisipkan isi variabel nama. Di Ruby, string berpetik tunggal (misalnya: 'halo semua') berfungsi persis seperti raw string di Python (tanpa interpolasi.)

Tidak ada kelas “new style” dan “old style”. Cuma ada satu macam kelas. Anda tidak akan pernah langsung mengakses atribut. Di Ruby, semua menggunakan

pemanggilan metode. Cara praktisnya adalah dengan menggunakan attr_reader, attr_writer, maupun attr_accessor.

Buka dan tutup kurung untuk pemanggilan metode biasanya dihilangkan (opsional / boleh dipakai boleh juga tidak).

Ada public, private, dan protected untuk mengatur akses ke instance member, yang biasanya di Python diakali menggunakan aturan penamaan _seperti_ __ini__.

Menggunakan “mixin”, bukan multiple inheritance.

Page 19: Pengenalan Ruby

Anda bisa “membuka” sebuah kelas kapan saja untuk mengubah atau menambahkan metode-metode ke kelas tersebut.

Ruby menggunakan true, false, dan nil, sedangkan Python menggunakan True dan False, dan None.

Kalau dites logika untuk true, hanya false dan nil yang dianggap bernilai false. Semua nilai lain dianggap true (termasuk 0, 0.0, "", dan []).

Menggunakan elsif sebagai ganti elif. Menggunakan require sebagai ganti import. Cara penggunaannya sama. Penggunaan komentar biasanya di atas yang ingin didokumentasikan (jadi bukan di

bawahnya.) Biasa digunakan untuk menghasilkan dokumentasi secara otomatis dari source code.

Ada banyak shortcut yang bisa dapat Anda pelajari untuk melakukan hal-hal yang sering digunakan dengan lebih cepat. Shortcut tersebut membuat Ruby menyenangkan (fun!) dan membuat Anda sangat produktif.