Seperti yang telah disebutkan sebelumnya, Ruby merupakan bahasa pemrograman yang berorientasi objek. Semua yang bisa kita manipulasi di Ruby adalah sebuah objek.
Di dalam pemrograman berorientasi objek, sebuah kelas memuat berbagai properti, seperti method dan variabel. Kelas bisa mewarisi properti dari kelas pendahulu (parent class) atau superclass nya, sehingga membentuk hierarki kelas dengan base class di tempat paling atas. Kelas paling atas (base class) di Ruby adalah Object.
Sebuah kelas didefinisikan dengan keyword class, dan diakhiri dengan sebuah end.
classHellodefinitialize(name)@name=nameenddefhello_txtputs"Hello, " + @name + "!"endendhi=Hello.new("World")hi.hello_txt# => Hello, World!Method initialize pada Ruby merupakan constructor, yang otomatis akan dieksekusi pertama kali setelah objek kelas tersebut diciptakan. Pada contoh di atas, method initialize akan mendefinisikan sebuah instance variable @name dan meng-assign-nya dengan argumen yang dimasukkan.
Instance variabel adalah variabel yang ada di dalam instance sebuah kelas, dan cakupannya terbatas. Sebuah instance variable diawali dengan tanda @, seperti instance variable pada contoh sebelumnya @name. Kita bisa mendefinisikan sebuah instance variable di dalam atau di luar sebuah method. Namun, kita hanya bisa mengaksesnya dari luar objek dengan menggunakan method accessor: getter dan setter.
classHellodefinitialize(name)@name=nameenddefhello_txtputs"Hello, " + @name + "!"enddefname@nameenddefname=(value)@name=valueendendhi=Hello.new("World")hi.name# => Worldhi.name="CCBI"hi.name# => CCBIRuby menyederhanakan pembuatan getter dan setter secara meta-programming dari kelas Module, yakni menggunakan method attr, attr_reader, attr_writer dan attr_accessor.
Method attr akan membuat sebuah getter. Jika argumen keduanya true, ia juga akan membuat sebuah setter.
classBirdattr:chirp,trueendBird.instance_methods - Object.instance_methods# => ["chirp","chirp="]bird=Bird.newbird.chirp="Tweet!"bird.chirp# => Tweet!Method attr_reader akan menciptakan getter, sedangkan method attr_writer akan menciptakan setter.
classBirdattr_reader:chirp# getterattr_writer:chirp# setterendBird.instance_methods - Object.instance_methods# => ["chirp","chirp="]Method attr_accessor akan memberikan efek yang sama seperti jika memanggil attr_reader dan attr_writer.
classBirdattr_accessor:chirp,:fly,:spawnendBird.instance_methods - Object.instance_methods# => [:chirp, :chirp=, :fly, :fly=, :spawn, :spawn=]Class variable merupakan variabel yang digunakan bersama oleh semua instance suatu kelas, mirip seperti konsep static variable di Java atau C++. Class variable di Ruby harus diawali dengan @@.
classBird@@count=0definitialize@@count += 1enddefcount@@countendendb1=Bird.newb2=Bird.newb3=Bird.newb1.count# => 3Class method (static method) merupakan method yang berasosiasi dengan kelas atau module di Ruby, bukan instance dari suatu kelas. Kita bisa mengeksekusi sebuah class method tanpa sebuah instance objek. Class method di Ruby selalu diawali dengan self.
classBirddefself.tweetputs"Tweeeeet!!"endendBird.tweet# => Tweeeeet!!Pewarisan (inheritance) pada Ruby dilakukan dengan menggunakan operator <. Tidak seperti C++ yang mendukung multiple inheritance, Ruby menggunakan single inheritance, yaitu sebuah kelas hanya bisa mewarisi properti dari 1 parent class.
classBirdattr_accessor:chirp,:eggendclassDuck < Birdattr_accessor:quackendd=Duck.newputd.respond_to?(:egg)# => trueJika kelas Bird di atas berada di file yang berbeda dengan kelas Duck, maka terlebih dulu kita perlu require file tersebut. Ruby akan mencari file tersebut berdasarkan $LOAD_PATH yang telah didefinisikan.
Akses ke metode dan konstan pada suatu kelas di Ruby, bisa diatur dengan kata kunci berikut ini:
publicDefault, bisa diakses oleh siapa saja dari mana saja.privateMembatasi cakupan suatu metode hanya bisa diakses oleh objek tersebut.protectedBisa diakses oleh objek dari kelas tersebut dan dari kelas-kelas turunannya.
classDogdefbarkputs"Woof!"endprivatedefwalkputs"Walk!"endprotecteddefsitputs"Sit!"enddefeatputs"Eat!"endendclassChihuahua < Dogdefsitdownself.sitenddefrunself.walkendendd=Dog.newd.bark# => 'Woof!'d.walk# => errord.sit# => errord.eat# => errorc=Chihuahua.newc.bark# => 'Woof!'c.sitdown# => 'Sit!'c.run# => errorPada Ruby, modul itu mirip seperti kelas, tetapi tidak bisa di-instantiate. Sebuah kelas dapat mengandung > 1 modul. sehingga ketika kelas tersebut di-instantiate, maka semua properti dari modul-modul tersebut akan tercakup pada objek si kelas. Hal ini memungkinkan konsep yang mirip dengan multiple inheritance. Identifier pada tiap-tiap modul akan di-override oleh definisi yang terakhir. Dengan demikian, penamaan yang bertabrakan bisa dihindari.
Pada Ruby, modul juga merupakan sebuah namespace. Sebuah namespace adalah sekumpulan nama (seperti nama-nama method), yang memiliki cakupan/konteks. Sebuah kelas Ruby juga bisa dianggap sebagai namespace.
Penamaan modul harus diawali dengan huruf besar. Sebuah modul bisa mengandung metode, konstan, modul lain dan bahkan kelas. Sebuah modul bisa diwarisi oleh modul lain, tetapi tidak bisa diwarisi oleh sebuah kelas.
moduleFlyingAnimaldefflyputs"Flying high.."endendmoduleLayingAnimaldefeggputs"Spawning.."endendclassBirdincludeFlyingAnimal,LayingAnimalendb=Bird.newb.fly# => Flying high..b.egg# => Spawning..Di Ruby, variabel tidak perlu dideklarasikan. Ruby menggunakan "duck typing", semacam dynamic typing. Jika sebuah nilai bertingkah laku seperti tipe tertentu, misalnya integer, maka Ruby akan memberinya suatu konteks dan memberlakukannya pada kontes tersebut. If it walks like a duck, quacks like a duck, flies like a duck, and swims like a duck (or integer or float, etc.), then it is probably a duck.
Sekilas ulasan kembali beberapa jenis variable di Ruby.
Variabel lokal memiliki cakupan yang lokal juga sesuai konteksnya, misalnya di dalam suatu metode atau perulangan. Variabel lokal pada Ruby hanya boleh diawali dengan huruf kecil atau underscore (_).
classFoodefself.barFoobar=1# error_foobar=2puts_foobarendendInstance variable hanya bisa diakses dari luar suatu objek melalui accessor method. Instance variable selalu diawali dengan tanda @.
Class variable merupakan variabel yang digunakan bersama oleh semua instance suatu kelas, mirip seperti konsep static variable di Java atau C++. Class variable di Ruby selalu diawali dengan @@.
Global variable bisa diakses dari mana saja. Di Ruby, global variable harus diawali dengan tanda $.
Variabel konstan di Ruby harus diawali dengan huruf besar, dan biasanya (secara konvensi) nama sebuah konstan ditulis dengan huruf besar semua.