Ruby

**Ruby** ialah dicipta sebuah bahasa pengaturcaraan berorientasi objek. Ia menggabungkan sintaks yang diilhamkan dari Perl dengan ciri-ciri orientasi objek yang menyerupai Smalltalk, dan juga berkongsi beberapa ciri dengan Python, Lisp, Dylan dan CLU. Ruby merupakan sebuah bahasa tertafsir laluan tunggal. Pelaksanaan utamanya ialah perisian bebas yang diagihkan di bawah sebuah pelesenan sumber terbuka.

## Sejarah

Bahasa ini dicipta oleh Yukihiro Matsumoto (digelar sebagai "Matz"), yang mula membina Ruby pada 24 Februari 1993, dan kemudiannya menerbitkannya kepada orang awam pada tahun 1995. Beliau memberi nama "Ruby" sempena hari jadi seorang rakan. Setakat September 2006, versi stabil yang terakhir ialah 1.8.5. Ruby 1.9 (dengan beberapa perubahan besar) pula sedang dalam pembinaan.

## Falsafah

Tanggapan utama Matz menganai reka bentuk Ruby ialah untuk menjadikan para pengaturcara gembira dengan mengurangkan bebanan kerja yang perlu mereka hadapi, iaitu dengan menuruti prinsip-prinsip reka bentuk antara muka pengguna yang baik. Beliau menegaskan bahawa reka bentuk sistem perlu menekankan kepentingan manusia, bukannya komputer:


Bisanya orang, terutamanya jurutera komputer, memfokuskan mesin. Mereka fikir, "Dengan melakukan ini, mesin ini akan berjalan lebih pantas. Dengan melakukan ini, mesin ini akan berjalan dengan lebih berkesan. Dengan melakukan ini, mesin ini akan menjadi itu dan ini." Mereka memfokuskan mesin. Tetapi sebenarnya kita perlu memfokuskan manusia itu sendiri, tentang bagaimana manusia mengambil berat dengan melakukan pengaturcaraan atau mengendalikan aplikasi mesin. Kitalah ketua. Mereka [mesin] adalah hamba.


Ruby dikatakan mengikut **[[prinsip sedikit kejutan]]** *(prinsiple of least surprise)*, iaitu bahasa tersebut menuruti tanggapan si pengaturcara. Pepatah tersebut tidak berasal dari Matz dan, umumnya, Ruby lebih mengikut paradigma yang diistilahkan sebagai "Matz's Least Surprise", walaupun ramai pengaturcara menganggap bahawa ia juga mendekati model mental mereka.

## Semantik

Ruby ialah berorientasi objek: setiap satu data merupakan objek, sampaikan kelas dan jenis yang ditakrifkan bahasa lain sebagai primitif (seperti integer, boole, dan "nil"). Setiap fungsi ialah kaedah. Pemboleh ubah sentiasa merujuk kepada objek, tetapi pemboleh ubah itu sendiri bukannya objek. Ruby menyokong pewarisan dengan **hantaran dinamik** (*dynamic dispatch*), **campuran** (*mixin*) dan **kaedah unsur tunggal** (*singleton method*). Walaupun Ruby tidak menyokong **pewarisan berbilang** (*multiple inheritance*), kelas (*class*) boleh mengimport modul sebagai campuran.

Ruby telah disifatkan sebagai sebuah bahasa pengaturcaraan berbilang paradigma: ia membenarkan pengaturcaraan bertatacara (mentakrifkan fungsi atau pembolehubah di luar kelas membuatkan mereka sebahagian daripada akar, objek 'self'), dengan perorientasian objek (semua benda ialah objek) atau pengaturcaraan kefungsian (ia mempunyai fungsi awanama, penutupan, dan pelanjaran (*continuation*); semua kenyataan ada nilainya, dan fungsi memulangkan penilaian yang terakhir). Ia menyokong kaji diri, pantulan dan metapengaturcaraan, di samping bebenang berasaskan pentafsir. Ruby menampilkan penjenisan dinamik serta menyokong polimorfisme parameter.

Menurut FAQ Ruby, "Jika anda sukakan Perl, anda akan sukakan Ruby dan rasa tidak asing dengan sintaksnya. Jika anda sukakan Smalltalk, anda akan tidak akan rasa janggal dengan semantiknya. Jika anda sukakan Python, anda mungkin atau mungkin tidak akan tidak selesa dengan perbezaan yang amat besar dari segi rekaan antara Python dan Ruby/Perl."

## Ciri-ciri

* berorientasi objek
* empat peringkat lingkungan pemboleh ubah: global, kelas, ciptaan *(instance)*, dan tempatan.
* tanganan pengecualian *(exception handling)*
* pelelar *(iterator)* dan tutupan *(closure)* (dengan memindahkan blok kod)
* ungkapan nalar *(regular expression)* yang menyerupai Perl pada peringkat teras
* pembeban pengoperasi *(operator overloading)*
* kutipan sampah *(garbage collection)* automatik
* mudah alih
* pemuatan dinamik terhadap perpustakaan DLL pada hampir semua platform
* *[[introspeksi (pengaturcaraan)|introspeksi]]*, pantulan *(reflection)*, dan pengaturcaraan meta *(meta-programming)*
* pustaka piawai *(standard library)* yang agak luas
* menyokong suntikan tanggungan *(dependency injection)*
* penyelanjaran *(continuation)* dan penjana *(generator)*

### Interaksi

Agihan rasmi Ruby juga memasukkan "irb", sebuah pentafsir baris perintah (command-line) saling tindak yang boleh digunakan untuk menguji kod secara serta-merta. Demikian adalah salah satu contoh bagi sebuah sesi bersama atur cara saling tindak ini:

 $ irb
 irb(main):001:0> puts "Hello, Dunia"
 Hello, Dunia
 => nil
 irb(main):002:0> 1+2
 => 3

## Kritikan

Antara kritikan paling utama dalam Ruby ialah tiada sokongan untuk Unicode, walau bagaimanapun ia memiliki sedikit sokongan untuk UTF-8.

## Sintaks

Sintaks bagi Ruby adalah hampir sama dengan Perl dan Python. Takrifan kelas dan kaedah adalah menggunakan isyarat kata kunci. Berbeza dengan Perl, pemboleh ubah tidak semestinya didahulukan dengan sigil. (sigil boleh digunakan untuk mengubah semantik lingkupan pemboleh ubah tersebut) Perbezaan yang paling ketara dengan C dan Perl ialah kata kunci biasanya digunakan untuk mentakrifkan bok kod logikal, tanpa menggunakan braket. Pemisah baris adalah signifikan dan dianggap sebagai pengakhir penyataan (noktah bertindih boleh juga digunakan sebagai alternatif). Berbeza dengan Python, engsot tidak signifikan.

Sila lihat contoh-contoh kod yang membayangkan sintaks Ruby di bahagian **Contoh** rencana ini.

## Contoh

Beberapa kod asas bagi Ruby:


```ruby
# Semua dalam Ruby, termasuk harafiah, adalah objek
 -199.abs                                       # 199
 "ruby sangat menarik".length                   # 19
 "Ali".index("i")                               # 2
 "Selamat pagi".split(//).uniq.sort.join        # "Saegilmpt"
```


### Kelas

Kod dibawah ini mentakrifkan sebuah kelas dinamakan Person. Sebagai tambahan untuk pengawalan, konstruktor lazim untuk mencipta objek baru, ia mempunyai dua kaedah: satu untuk menggantikan operator pembeza  (supaya `Array#sort` boleh menyusun mengikut umur) dan satu lagi untuk menggantikan kaedah `to_s` (supaya `Kernel#puts` boleh memformat outputnya). Di sini, "`attr_reader`" adalah satu contoh bagi pengaturcaraan meta dalam Ruby: "attr" mentakrifkan kaedah *geter (getter)* dan *penentu (setter)* untuk *pemboleh ubah ciptaan (instance variable)*; "attr_reader": hanya kaedah geter. Juga, penyataan terakhir yang dinilai dalam sebuah kaedah ialah nilai yang dikembalikan, oleh itu penggunaan 'return' yang eksplisit boleh diabaikan.


```ruby
class Orang
   def initialize(nama, umur)
     @nama, @umur = nama, umur
   end
 
   def <=>(orang)
     @umur <=> orang.umur
   end
 
   def to_s
     "#{@nama} (#{@umur})"
   end
 
   attr_reader :nama, :umur
 end
 
 group = [ Orang.new("Ali", 20), 
           Orang.new("Abu", 63), 
           Orang.new("Ahmad", 16) ]
 
 puts group.sort.reverse
```


Paparan yang muncul daripada yang di atas adalah tiga nama dalam susunan umur menurun:
 Abu (63)
 Ali (20)
 Ahmad (16)

## Rujukan

## Pautan luar

*  Tapak web rasmi Ruby
*  Tapak web rasmi Ruby
*  Why's (Poignant) Guide to Ruby
*  Malaysia.rb, kumpulan peminat Ruby Malaysia.