Ruby
|
Paradigma
| berbilang paradigma
(kefungsian, imperatif, logik, berorientasi objek (berasaskan kelas))
|
---|
Muncul pada
| 1995
|
---|
Direka oleh
| Yukihiro Matsumoto
|
---|
Pembangun
| Yukihiro Matsumoto (antara lain)
|
---|
Lepasan stabil
| 1.9.0 (
25 Disember
2007
)
|
---|
Disiplin penjenisan
| dinamik
(
"itik"
)
|
---|
Pelaksanaan utama
| Ruby,
JRuby
|
---|
Dipengaruhi
| Smalltalk
,
Perl
,
LISP
,
Scheme
,
Python
,
CLU
,
Eiffel
,
Dylan
|
---|
Mempengaruhi
| Groovy
|
---|
OS
| Silang pelantar
|
---|
Lesen
| Lesen Ruby
dan
GPL
|
---|
Laman web
| www.ruby-lang.org
|
---|
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
.
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.
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.
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
[1]
. Ruby menampilkan
penjenisan dinamik
serta menyokong
polimorfisme parameter
.
Menurut
FAQ
Ruby,
[2]
"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."
- 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
,
pantulan
(reflection)
, dan
pengaturcaraan meta
(meta-programming)
- pustaka piawai
(standard library)
yang agak luas
- menyokong suntikan tanggungan
(dependency injection)
- penyelanjaran
(continuation)
dan penjana
(generator)
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
Antara kritikan paling utama dalam Ruby ialah tiada sokongan untuk
Unicode
, walau bagaimanapun ia memiliki sedikit sokongan untuk
UTF-8
.
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.
Beberapa kod asas bagi 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"
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.
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)