1.1 Pengenalan Ruby
Ruby merupakan bahasa scripting yang memiliki string processing yang sangat akurat misalnya regular expression sehingga sangat cocok untuk administrator sistem untuk membuat shell script yang powerfull. Di pihak lain, bahasa scripting menawarkan pengembangan aplikasi yang cepat misalnya pembuatan aplikasi GUI, web scripts, system utilities, dan aplikasi yang membutuhkan pemrosesan string ataupun perhitungan yang akurat. Pencipta Ruby, Yukihiro Matsumoto (Matz), 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.
1.1.1 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.
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 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 RailS. Ruby juga sepenuhnya bebas. Tidak hanya gratis, tetapi juga bebas untuk menggunakan, memodifikasi dan mendistribusikan Ruby.
1.1.2 Kelebihan Ruby
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 Python.” Di Ruby, semua adalah obyek. Setiap informasi dan kode bisa diberi property dan action. Pemrograman berorientasi obyek memanggil property dengan nama variabel instant dan action, yang disebut sebagai metode. Pendekatan murni berorientasi obyek terutama terlihat pada demonstrasi sedikit kode yang diberikan pada number.
Di banyak bahasa-bahasa lain, number dan tipe primitif bukan obyek. Ruby mengikuti pengaruh bahasa Smalltalk dengan memberikan metode dan variabel instant pada semua tipe. Ini memudahkan menggunakan Ruby, karena peraturan-peraturan mengenai obyek semua berlaku pada Ruby. 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 ingin menggunakan kata plus yang lebih mudah dibaca, maka dapat menambahkan metode tersebut pada kelas Numeric.
class Numeric
def plus(x)
self.+(x)
end
end
y = 5.plus 6
# y sekarang adalah 11
Demi kemudahan, operator-operator Ruby adalah juga metode. Kita juga bisa mendefinisikan ulang operator. 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 Ruby.”
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.
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 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.
Secara umum, Rubyist menganggap ini sebagai cara yang lebih jelas ketimbang multiple inheritance, yang rumit dan bahkan terlalu membatasi. 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 instant.
* $var adalah variabel global.
Simbol-simbol 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 instant.
Ruby kaya fitur, antara lain sebagai berikut:
* Ruby merupakan bahasa interpreter.
* Ruby memiliki sintaks yang sederhana, mudah dipelajari dan dipahami.
* 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.
* 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, kita 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.
* Dan yang terakhir, tentunya Ruby gratis bahkan untuk aplikasi komersial.
1.1.3 Dasar Pemrograman Ruby
Sebagai bahasa scripting yang berbasis interpreter, Ruby menawarkan modus interaktif, yakni Interactive Ruby yang disingkat dengan irb. Untuk masuk ke modus interaktif Ruby, cukup mengetikkan irb pada command prompt, untuk keluar cukup menekan tombol Ctrl-D atau ketikkan “exit”. Dapat juga menambahkan opsi ”—simple-prompt” pada irb agar bentuk prompt-nya berubah menjadi >>.
Di samping itu, tentunya program Ruby juga dapat disimpan dalam file berextension ‘.rb’. Sama halnya seperti Python, modus interaktif Ruby juga dapat digunakan sebagai kalkulator untuk perhitungan sederhana. Kemampuan menghitung Ruby tidak kalah jika dibandingkan dengan Python. Konon, Ruby memiliki kecepatan eksekusi program yang lebih cepat dibandingkan dengan Python.
Gambar 2.1 Contoh Penulisan Sintax Ruby pada Command Prompt
1. Aturan penamaan variabel
Karena Ruby bersifat dynamic-typing, Kita tidak perlu mendeklarasikan tipe dan variable yang ingin kita gunakan seperti pada bahasa C. Kita cukup memasukkan nilai ke variable yang ingin kita pakai. Aturan penamaan variabel sama dengan aturan penamaan variabel pada umumnya, yakni tidak boleh dimulai dengan angka dan tidak memakai keyword penting dari bahasa tersebut.
Berikut contoh deklarasi variabel:
Contoh variabel yang benar:
x = 888
ini_variabel_string = “halo”
Contoh variabel yang tidak benar:
8x = 888
while = “halo” # while adalah reserved keyword
2. Konstanta
Konstanta tidak lain adalah sebuah variabel yang isinya tetap (tidak berubah). Konstanta di Ruby dideklarasikan dengan huruf kapital pada huruf pertama. Suatu konstanta tetap dapat diubah nilainya. Pemberian status konstanta pada suatu variabel hanya akan memberikan suatu peringatan apabila kita mengubah isi konstanta tersebut.
3. Input Output
Untuk meminta input-an dari user, kita menggunakan perintah gets. Sedangkan untuk output ke layar monitor, kita dapat menggunakan puts, print maupun printf.
>> puts “Halo, pa kabar ?”
Halo, pa kabar?
=> nil
>> print “Halo, pa kabar ?”
Halo, pa kabar ?=> nil
>> nama = gets
Eric
=> “Eric\n”
>> printf “Nama saya %s”, nama
printf “Nama saya %s”, nama
Nama saya Eric
=> nil
Adapun perbedaan antara puts , print dan printf yakni di mana puts akan menambahkan karakter newline (‘\n’) pada akhir string dan parameternya harus string, sedangkan print hanya mencetak string tanpa menambahkan karakter newline, printf sama dengan print; bedanya printf mengenal formatting seperti %s untuk string,%f untuk float, %d untuk integer, dan seterusnya. Perintah printf ini sama dengan perintah printf di bahasa C.
4. Struktur program
Program Ruby umumnya juga memakai indentasi seperti bahasa Python. Akan tetapi indentasi tidak mutlak harus dilakukan, karena Ruby menggunakan keyword end untuk menandakan akhir dari suatu bagian program.
5. Lain-lain
Mungkin pada beberapa contoh di atas, sering melihat tulisan nil. Nil berarti suatu objek di Ruby sama dengan NULL di bahasa C. Nil berarti hasil eksekusi perintah tersebut tidak mengembalikan objek apapun alias nil (tidak memiliki return value). Misalkan perintah puts hanya mencetak string ke layar dan tidak mengembalikan objek apapun untuk disimpan alias nil. Akan tetapi lainnya halnya dengan a = “halo” akan mengembalikan objek String “halo” yang akan disimpan dalam variabel a. Untuk komentar pada program Ruby, Kita dapat menggunakan tanda # . Untuk lebih dari satu statement pada satu baris , Kita dapat menggunakan pemisah ‘;’. Sedangkan untuk statement yang lebih dari satu baris, Kita dapat menggunakan tanda ‘\’.
>> a = 1#Variabel a berisi 1
=> 1
>> print “Halo “; puts “ apa
kabar ?”
Halo apa kabar ?
=> nil
>> b = 1 + 3 + 5 \
?> + 7 + 9
=> 25
1.1.4 Tipe Data Dasar
Setelah berkenalan dengan dasar-dasar interpreter Ruby, selanjutnya dibahas beberapa tipe data dasar yang disediakan Ruby yang tentunya merupakan instansi dari kelas–kelas mengingat Ruby adalah bahasa berorientasi objek yang murni. Di samping itu, akan dibahas beberapa metode yang umum dari kelas– kelas tersebut.
1. Angka
Ruby dapat menangani angka baik yang bertipe integer maupun float. Untuk tipe data Integer di Ruby, kelas Integer dibagi dalam dua kelas yakni FixNum dan BigNum. Angka dengan batas -230 sampai 230–1 tergolong dalam kelas FixNum; apabila suatu angka telah melampaui batas tersebut, maka akan digolongkan dalam kelas BigNum. Karena Ruby bersifat dynamic–typing, Kita tidak perlu melakukan konversi dari FixNum ke BigNum karena konversi akan dilakukan secara otomatis. Sedangkan untuk angka yang bertipe float, Ruby akan menganggap objek angka tersebut merupakan instansi dari kelas Float.
Seperti bahasa pemrograman umumnya, pada Ruby dapat menggunakan prefiks (awalan) untuk menandakan arti angka tersebut, misalya untuk menyatakan bilangan negatif, 0 untuk bilangan oktal , 0b untuk bilangan biner dan 0x untuk bilangan heksadesimal serta e untuk bilangan eksponensial. Untuk mempermudah penulisan suatu angka dengan nilai yang sangat besar, Kita dapat membubuhkan karakter _ pada penulisan angka (karakter _ tidak akan disimpan, hanya untuk membantu saja).
>> a = 2
=> 2
>> a.class
=> FixNum
>> a = a ** 31
=> 2147483648
>> a.class
=> BigNum
>> 188_888_000_000
=> 188888000000
>> 0x6AF
=> 1711
>> 1.89e+18
=> 1.89e+18
>> b = 1.4
=> 1.4
>> b.class
=> Float
2. String
Tipe data String di Ruby sama dengan tipe data String pada bahasa pemrograman lain umumnya. Untuk membuat tipe data String, kita dapat menggunakan kutip satu ‘ ataupun kutip dua “ . Adapun perbedaan di antara keduanya, yakni di mana objek String yang dibuat dengan kutip dua “ akan mengerti karakter khusus seperti ‘\n’,’\r’,’\b’ ,dsb. ; sedangkan karakter dengan objek String yang dibuat dengan kutip satu ‘ tidak bisa menerjemahkan karakter khusus di atas.
Perhatikanlah contoh berikut:
>> a = “Hello\n”
=> “Hello\n”
>> print a
Hello
=> nil
>> b = ‘Hello\n’
=> “Hello\\n”
>> print b
Hello\n=> nil
Kelas String kaya akan metode-metode yang powerful. Kita dapat mencoba beberapa di antaranya seperti berikut ini:
· Length : untuk mengetahui panjang suatu string.
· Capitalize : untuk mengubah huruf pertama pada awal kalimat menjadi huruf kapital.
· Downcase : mengubah string menjadi huruf kecil.
· Upcase : mengubah string menjadi huruf besar.
· Swapcase : mengubah objek string dengan huruf kecil diubah menjadi huruf kapital dan sebaliknya.
· Strip : membuang karakter whitespace di awal dan akhir string.
· Reverse : membalikkan string.
· Include ? str : mengembalikan true jika substring str terdapat dalam string dan false jika tidak ada.
· Chop : membuang karakter terakhir dari string.
Salah satu hal yang unik dari Ruby adalah Kita dapat menambahkan tanda ‘!’ di akhir metode untuk menandakan metodenya bersifat destruktif di mana hasil metode tersebut berdampak langsung pada objeknya.
>> “Hello”.length
=> 5
>> “hello”.capitalize
=> “Hello”
>> “HELlo”.downcase
=> “hello”
>> “HeLLo”.upcase
=> “HELLO”
>> “hElLo”.swapcase
=> “HeLlO”
>> “hello”.reverse
=> “olleh”
>> “ hello “.strip
=> “hello”
>> “helloo”.chop
=> “hello”
>> “hello”.include? “h”
=> true
>> a = “ Hello “
=> “ Hello “
>> a.strip
=> “Hello”
>> a
=> “ Hello “
>> a.strip!
=> “Hello”
>> a
=> “Hello”
3. Array
Tipe data Array di Ruby hampir sama dengan tipe data array pada bahasa pemrograman lain umumnya. Tipe data Array di Ruby sama dengan tipe data list di Python. Untuk membuat suatu objek Array baru, Kita dapat menggunakan literal Array [] ataupun konstruktor Array.new. Isi array dapat berupa objek apapun baik angka, string, maupun objek lain termasuk objek array itu sendiri. Untuk mengakses elemen objek Array ini, kita menggunakan indeks di mana indeks awal dimulai dari 0 sampai panjang array – 1. Kita juga dapat menggunakan indeks negatif di mana indeks -1 berarti elemen terakhir , -2 berarti elemen kedua terakhir, dan seterusnya.
Apabila kita mencoba mengakses elemen Array pada indeks yang di luar jangkauan, pernyataan tersebut tidak akan menyebabkan error seperti IndexError : list index out of range di Python, Ruby akan mengembalikan objek nil. Untuk mengubah isi array ataupun menambahkan data pada objek Array dengan indeks tertentu, kita bisa menggunakan statement biasa seperti array[indeks] = nilai baru. Apabila kita ingin membuat objek Array yang berisi string, akan repot sekali untuk menambahkan tanda kutip pada setiap elemen Array. Hal tersebut dapat diatasi dengan menggunakan prefiks %w. Untuk jelasnya, lihat contoh berikut:
>> a = []
=> []
>> a = [1,2,”m”,[3,4,5]]
=> [1, 2, “m”, [3, 4, 5]]
>> a[0]
=> 1
>> a[3]
=> [3, 4, 5]
>> a[3][1]
=> 4
>> a[-1]
=> [3, 4, 5]
>> a[6]
=> nil
>> a[1] = 88
=> 88
>> a
=> [1, 88, “m”, [3, 4, 5]]
>> c = %w(Anto, Eric, Isabel)
=> [“Anto,”, “Eric,”, “Isabel”]
Metode-metode pada kelas Array :
* Length : untuk mengetahui ukuran array.
* Push(nilai_baru) : untuk menambah data pada array. Data terbaru akan ditempatkan paling akhir.
* Pop : mengembalikan data pada indeks terakhir array dan menghapus data pada indeks terakhir.
* Reverse : membalik isi data array.
* Sort : mengurut isi array secara ascending.
>> a = [“a”,”b”,”c”]
=> [“a”, “b”, “c”]
>> a.length
=> 3
>> a.push(“d”)
=> [“a”, “b”, “c”, “d”]
>> a.pop
=> “d”
>> a
=> [“a”, “b”, “c”]
>> a.reverse
=> [“c”, “b”, “a”]
>> a.sort
=> [“a”, “b”, “c”]
4. Hash
Tipe data hash di Ruby sama dengan tipe data dictionary di Python. Untuk membuat objek hash yang baru, Kita dapat menggunakan literal hash {} ataupun konstruktor Hash.new. Lain halnya dengan array, untuk mengakses elemen objek Hash kita tidak menggunakan indeks seperti array. Kita dapat mendefinisikan kunci(key) yang unik untuk setiap elemen. Sama halnya seperti array, apabila kita mengakses elemen dengan key yang tidak tercantum di hash, maka akan mengembalikan nilai nil.
>> alamat = {
?> “Amat” => “Kemanggisan Raya
50”,
?> “Budi” => “Sudirman 80”,
?> “Eric” => “Sandang 9A”,
?> “Melissa” => “Pandu 77”
?> }
=> {“Eric”=>”Sandang 9A”,
“Budi”=>”Sudirman 80",
“Amat”=>”Kemanggisan Raya 50",
“Melissa”=>”Pandu 77"}
>> alamat[“Eric”]
=> “Sandang 9A”
>> alamat[“Dani”]
=> nil
5. Range
Objek range di Ruby merupakan suatu barisan di mana terdapat nilai awal dan nilai akhir dari barisan tersebut. Objek Range ini sama dengan perintah range() di Python. Untuk membuat suatu objek Range, kita dapat menggunakan operator range ‘..’ dan ‘...’. Format ‘..’ akan menciptakan objek Range yang ikut menyertakan elemen terakhirnya, sedangkan format ‘...’ akan menghilangkan elemen terakhirnya. Range di Ruby tidak dianggap sebagai objek Array melainkan dianggap sebagai suatu objek Range sendiri. Untuk menjadikannya objek Array, Kita dapat menggunakan metode to_a . Untuk lebih jelasnya, perhatikanlah contoh berikut.
>> a = (1..5)
=> 1..5
>> a.class
=> Range
>> (1..5).to_a
=> [1, 2, 3, 4, 5]
>> (1...5).to_a
=> [1, 2, 3, 4]
1.1.5 Seleksi dan Perulangan
Dalam pemrograman, kita tentunya mengenal istilah seleksi dan perulangan. Untuk seleksi kita akan menggunakan if, sedangkan untuk perulangan kita akan menggunakan for dan while. Penulis tidak akan lagi menjelaskan detail sintaks if, for, while karena sintaksnya hampir sama seperti umumnya.
1. Seleksi If
#if.rb
#!/usr/bin/env ruby
print “Masukkan nilai Anda : “
nilai = gets
nilai.chop!
if nilai.to_i >= 85
puts “Anda mendapat grade A”
elsif nilai.to_i >= 75
puts “Anda mendapat grade B”
elsif nilai.to_i >= 65
puts “Anda mendapat grade C”
else
puts “Anda mendapat grade D”
end #end untuk if
$ ruby if.rb
Masukkan nilai Anda : 80
Anda mendapat grade B
2. Perulangan Times
>> 3.times { print “Hi “ }
Hi Hi Hi=> 3
>> 3.times do
?> print “Hi “
?> end
Hi Hi Hi=> 3
3. Perulangan While
#while.rb
#!/usr/bin/env ruby
i = 1
while i<= 5
printf “%d “, i
i = i + 1
end # end untuk while
$ ruby while.rb
1 2 3 4 5
4. Perulangan For
#for.rb
#!/usr/bin/env ruby
for i in 1..5
if i%2 == 1
puts i.to_s + “ ganjil”
else
puts i.to_s + “ genap”
end #end untuk if
end #end untuk for
$ ruby for.rb
1 ganjil
2 genap
3 ganjil
4 genap
5 ganjil
1.1.6 Fungsi
Untuk mendefinisikan suatu fungsi, kita menggunakan kata kunci def diakhiri dengan end. Kita akan membuat fungsi faktorial.
#faktorial.rb
#!/usr/bin/env ruby
def faktorial(n)
hasil = 1
ctr = 0
n.times do
ctr += 1
hasil *= ctr
end #end untuk do
return hasil
end #end untuk def
puts “Faktorial 5 = “ +
faktorial(5).to_s
puts “Faktorial 10 = “ +
faktorial(10).to_s
$ ruby faktorial.rb
Faktorial 5 = 120
Faktorial 10 = 3628800