ruby sınıfları -...

28
3 Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en iyi yol yoktur. Konu- ları sistematik olarak öğrenmeye kalkarsanız, öğrenme olgusunun pedago- jik kısmı yok olur. En öne alınması gereken basit giriş çıkış bilgileri bile, o dilin sonraki kavramlarıyla ilgilidir. O nedenle, kitapta ya da derste henüz açıklanmadan kullanılan kavram ve deyimleri olduğu gibi belleğimize alıp kullanmaya başlamaktan başka yol yoktur. Bu iş, bir çocuğun ana dilini öğrenmesi gibidir; taklit et ve belleğe yerleştir. Bu bölümde, Ruby dilini öğrenirken karşılaşacağımız temel kavram- lar, ayrıntıya inmeden, listelenecektir. 3.1 Ruby Yorumlayıcı Bir Dildir Ruby yorumlayıcı bir dildir. Yazacağımız bir satırlık deyimleri, her işletim sisteminde var olan etkileşimli komut penceresinden (interactive console) yazacak ve Ruby’nin ona verdiği yanıtı gene o pencereden göreceğiz. Etki- leşimli pencerelere kabuk (shell) de denilir. İşletim sisteminin komutlarının doğrudan yazıldığı penceredir. Ruby 1.9 sürümü, öncekilere göre önemli yenilikler getirmiştir. Onlar- dan birisi unicode kullanmasıdır. Bir başkası da, üstsınıftaki bir metodun altsınıfa daha kolay çağrılmasıdır.

Upload: others

Post on 31-Oct-2019

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3Ruby Sınıfları

Bir programlama dilini öğrenirken izlenebilecek en iyi yol yoktur. Konu-ları sistematik olarak öğrenmeye kalkarsanız, öğrenme olgusunun pedago-jik kısmı yok olur. En öne alınması gereken basit giriş çıkış bilgileri bile, odilin sonraki kavramlarıyla ilgilidir. O nedenle, kitapta ya da derste henüzaçıklanmadan kullanılan kavram ve deyimleri olduğu gibi belleğimize alıpkullanmaya başlamaktan başka yol yoktur. Bu iş, bir çocuğun ana diliniöğrenmesi gibidir; taklit et ve belleğe yerleştir.

Bu bölümde, Ruby dilini öğrenirken karşılaşacağımız temel kavram-lar, ayrıntıya inmeden, listelenecektir.

3.1 Ruby Yorumlayıcı Bir Dildir

Ruby yorumlayıcı bir dildir. Yazacağımız bir satırlık deyimleri, her işletimsisteminde var olan etkileşimli komut penceresinden (interactive console)yazacak ve Ruby’nin ona verdiği yanıtı gene o pencereden göreceğiz. Etki-leşimli pencerelere kabuk (shell) de denilir. İşletim sisteminin komutlarınındoğrudan yazıldığı penceredir.

Ruby 1.9 sürümü, öncekilere göre önemli yenilikler getirmiştir. Onlar-dan birisi unicode kullanmasıdır. Bir başkası da, üstsınıftaki bir metodunaltsınıfa daha kolay çağrılmasıdır.

Page 2: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

16 BÖLÜM 3. RUBY SINIFLARI

3.2 Ruby Kabuğu

Ruby kabuğu irb adını alır. Her işletim sisteminin kabuğu içinden açılabilir.Bunun için, işletim isteminizin kabuğunu açınız ve oraya irb yazıp enterebasınız. Eğer, ruby’nin yüklendiği yeri sisteminiz biliyorsa, Ruby kabuğuaçılacak ve ekranda

irb(main):001:0>

ye benzer bir görüntü gelecektir. Artık Ruby etkileşimli penceresi (Rubykabuğu) açılmıştır. İstediğiniz Ruby komutunu (>) simgesinin karşısınayazabilirsiniz.

Bunun dışında, sisteminizde kısa yollar da yaratabilirsiniz. O zamanRuby’yi gösteren ikona tıklamanız yetecektir. Ruby’nin yüklendiğini ve yol-ların (path) ayarlandığını varsayıyoruz. Bunu henüz yapmadıysanız hemenyapmalısınız.

Windows’ta Ruby Kabuğu

Etkileşimli pencereyi açınız. Windows 8 de Windows tuşuna basınız Masaüstüne gelen uygulamalar arasında Siyah zeminli Komut İstemi ya da Mavizeminli Windows Power Shell kabuklarından birisini seçebilirsiniz. Yazaca-ğımız satırlara yer açmak için önce cd \ komutu ile kök dizinine gidelim.Sonra irb yazarak Ruby’nin etkileşimli penceresini açalım. Bütün bu basitişlerden sonra, Ruby kabuğu açılacaktır. Kabuğun görüntüsü sistemden sis-teme değişik olabilir. Bizim için önemli olan irb(main) : 001 : 0 > satırıdır.O satır, Ruby’nin sistemimizde yüklü olduğunu ve etkileşimli pencereninRuby komutu almaya hazır olduğunu gösterir. Aslında işletim sistemimi-zin kabuk penceresi Ruby’nin kabuk penceresine dönüşmüştür. Başka birdeyişle yorumlayıcı Ruby’nin etkileşimli ortamına girmiş durumdayız. Buortamdan çıkmadan, kabuk penceresine Ruby komutu dışında bir şey ya-zamayız. Ruby kabuğundan işletim sisteminin kabuğuna dönmek için

>exit ya da Ctrl + D

yazınız.

3.3 Gömülü Metotlar

Ruby’nin hemen her nesneye uygulanan gömülü komutları (metot) vardır.Bunlara çekirdek (kernel) metotları denir. Bunların hepsini birden ezber-lemeye kalkışmayınız. Kullandıkça önemlileri zaten aklınızda kalacaktır.

Page 3: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.4. KAYNAK PROGRAM 17

Başlarda yazacağımız komutların Ruby’nin çekirdeğinde olduğunu, onlarıbaşka yerlerden çağırmaya gerek kalmadan doğrudan kullanabileceğimizibilelim. Tabii, ileride kendimiz metot yazacak ya da çekirdekte olmayanmetotları da kullanacağız. O zaman gerekenleri söyleyeceğiz.

3.4 Kaynak Program

Ruby kabuğu yazdığımız tek satırlık komutlara hızlı ve doğru yanıtlar veri-yor. Yazdığımız satırlar bellekte tutuyor ve yukarı/aşağı ok tuşlarına basıl-dığında istediğimiz satırı tekrar görüntüye getiriyor. Bellekte tutulan satırsayısı sistemden sisteme değişebilir. Ancak, bilgisayar kapanınca bunlarınhepsi silinir. Onları yeniden yazmaktan başka bir yol yoktur. Çok kulla-nılan komutlar için bu durum komutu tekrar tekrar yazmayı gerektirir.Hem tekrarlardan sakınmak hem birden çok komut satırı yazabilmek için,kodlarımızı içeren dosyalar hazırlayıp kaydederiz. Bu tür dosyalara kaynakprogram (source) denilir.

Kaynak programı yazıp kaydetmek çok kolaydır. Bunun için basit bireditör (kelime işlemci) gerekir. Basit editör deyince, karakterleri yazan veyazılan metni kaydedebilen, kaydedilen metinleri yeniden çağırabilen bireditörü anlayacağız. Bilgisayar programı yazmak için MSWord gibi geliş-kin editörler kullanılmaz. Çünkü onlar derleyicimizin anlamayacağı biçem-leme kodları koyabilirler. Windows’taki Notepad kaynak program yazmakiçin uygundur. Her işletim isteminde böyle basit editörler vardır. ÖrneğinLinux’ta Gedit, Mac OS X’de TextWrangler gibi editör kullanılabilir. Kul-lanılan Programlama dilinin anahtar sözcüklerini farklı reklerle gösterenve kod tamamlama niteliklerine sahip editörler de vardır. O tür editör-ler program yazmayı kolaylaştırır. Ama şimdilik bize Notepad yetecektir.Anahtar sözcüklerin renkli görünmesini istiyorsanız, Windows’ta Notepadyerine Notepad++ kullanabilirsiniz. Ücretsiz olarak internetten indirilebilir.Öteki işletim sistemleri için de benzer editörler vardır.

Önce kaynak programlarımızı içine koyacağımız bir dizin yaratalım.Windows işletim sisteminde

Liste 3.1.

md c : \ RubyKaynak

3 cd c : \ RubyKaynak

deyimlerinin ilki c : sürücüsünde kök dizinine bağlı RubyKaynak adlı dizinyaratır. İkinci deyim, o dizini etkin duruma getirir.

Page 4: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

18 BÖLÜM 3. RUBY SINIFLARI

Şimdi Notepad ’i açalım ve şunları yazıp RubyKaynak dizini içineilkprg.rb adıyla kaydedelim.

Liste 3.2.

#! ruby2 . 0 . 02 # encoding : UTF−8

>puts "Ruby öğreniyorum . "

Birinci satır kullanılan Ruby sürüm numarasını gösteriyor. Yazılması ge-rekli değildir. İkinci satır, karakter kodlama sisteminin UTF-8 olduğunuRuby’ye bildiriyor. Programımızda ascii dışında karakterler varsa, bu sa-tırı yazmalıyız. Üçüncü satır, kaynak programımızın yapmasını istediğimizşeydir. "Ruby öğreniyorum" stringini konsola yazacaktır. Kaynak programaistediğiniz adı verebilirsiniz. Ama program adının sonuna .rb uzantısını ekle-melisiniz. Bu uzantı, dosyanın bir Ruby kaynak programı olduğunu belirtir.Dosyayı derleyebilmesi için, Ruby’nin bu uzantıyı görmesi gerekir.

Şimdi bu programı işletim sisteminin etkileşimli kabuğunda derleyipkoşturmak için

Liste 3.3.

1 ruby i lkprogram . rb

komutunu yazalım. KonsoldaRuby öğreniyorum .

yazısını göreceğiz. Ruby’de kaynak program yazıp koşturmak bu denli ko-laydır. Programın kısa ya da uzun olması önemli değildir. Çok iş için çokkomut, az iş için az komut yazıyoruz. Uzun ya da kısa kaynak programlarınıderleyip koşturmak için hep aynı işleri yapacağız.

3.5 Ruby Kaynak Programlarını Koşturma

Şimdi açık penceremizde ilk komutumuzu yazabiliriz. Her dile selam ilebaşlamak gelenektir. Biz de bu geleneğe uyalım:

Liste 3.4.

i r b ( main ) :001:0 > puts ’ Merhaba Ruby ! ’

puts Ruby’nin bir çekirdek (gömülü) fonksiyonudur. Bazı dillerdeki printlnyerine geçer. Parametresini string olarak yazar ve yeni satıra geçer. Para-metre olarak her nesneyi alabilir; çok hünerlidir. Kabuk penceresinde

Page 5: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.5. RUBY KAYNAK PROGRAMLARINI KOŞTURMA 19

Liste 3.5.

i r b ( main ) :001:0 > puts ’ Merhaba Ruby ’Merhaba Ruby=> n i l

4 i r b ( main ) :002:0 >

satırlarını görürüz. Bunlardan ilki puts metoduna yazdıracağımız ve tek tır-nak içine aldığımız metindir. O metni çift tırnak içine de alabilirdik. İkincisatır Ruby’nin verdiği yanıttır. İstenen metni, tırnak kullanmadan yazmış-tır. Bu Ruby programının çıktısıdır. Üçüncü satırdaki => nil deyimi, çık-tının nil olduğunu belirtiyor. Son satır ise, Ruby’nin etkileşimli kabuğununtekrar komut almaya hazır olduğunu belirtiyor. NilClass sınıfı daha sonraele alınacaktır.

Ruby’de metinleri sınırlamak için tek tırnak ve çift tırnak yanındabaşka simgeler de kullanırız. Çift tırnak (" ") tek tırnağa (’ ’) göre dahaişlevseldir. Ayrıntıları ileride ele alacağız. Şimdilik metinleri (string) tek yada çift tırnak içinde yazacağız.

Ruby’de metinler String sınıfından türetilir. String sınıfının, metin-lerle ilgili işlemleri yapan metotları vardır. Örneğin, yukarıdaki metni büyükharfe dönüştürmek için upcase metodunu kullanırız.

Liste 3.6.

1 i r b ( main ) :001:0 > puts ( " Merhaba Ruby" . upcase )MERHABA RUBY=> n i l

i r b ( main ) :002:0 >

Görüldüğü gibi, Ruby, metni ekrana büyük harflerle yazmıştır. Yazdırılacakmetni, puts metodunun parametresi sayıp, yukarıdaki gibi ( ) paranteziiçine alabiliriz. Ama bu Ruby için gerekli değildir. Komutu okuyanın kolayalgılaması içindir. Üstelik, usta Ruby programcıları metot parametreleriniparantez içinde yazmazlar. Biz gene de algılanırlığı kolaylaştırmak için yerigeldikçe blokları parantezlerle sınırlayacağız.

Yukarıdaki ilk satırda "Merhaba Ruby".upcase yazdık. Burada çifttırnak içindeki "Merhaba Ruby", String sınıfından üretilen bir nesnedir.Ruby’deki adı object’tir. upcase ise o nesneye uygulanan bir metottur.Nesne ile metot adı arasına nokta (.) bağlacı konulduğuna dikkat ediniz.

Bir sınıf bir şablon gibidir. Örneğin, otomobil dediğimizde, bir eşyasınıfını kasdederiz; belirli bir otomobili değil. Ama Erol’un otomobili de-diğimizde, somut bir varlığı kastediyor oluruz. Otomobil bir sınıftır, ama

Page 6: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

20 BÖLÜM 3. RUBY SINIFLARI

Erol’un otomobili, otomobil sınıfından türetilmiş somut bir nesnedir (ins-tance). String (metin) dediğimizde de belirli bir stringi kastetmiyoruz. Ama"Merhaba Ruby" dediğimizde somut bir string kastediliyor (bkz ([7]).

Sınıflar, nesneleri üreten şablonlardır. Bir sınıftan üretilen nesne, anabellekte heap denilen kısımda yer alır. Ona çekirdek metotlarını ve varsasınıfın metotlarını uygulayabiliriz. Heap’te yaratılan nesne, işi bitene kadarorada kalır. İşi bitince ana bellekten silinir. Bu özelik, büyük programlardaana belleğin dolup programın kitlenmemesi için iyi bir yöntemdir.

3.6 Metotlar

Bilgisayarlar verileri işler. Metotlar, her programlama dilinde verileri işlemearaçlarıdır. Onlar, istediğimiz verileri içeren değişkenleri işleyen kodlar ileistediğimiz başka işleri yapan kodları kendi içinde barındıran program nes-neleridir. Bir metot çağrılınca, onun içindeki kodlar çalışır. Böylece onuniçindeki komutları tek tek yazmaktan kurtulmuş oluruz. Bir metodu prog-ramda istediğimiz yerlerde tekrar tekrar çağırabiliriz. Üstelik, gerekli isebaşka programlara da taşırız. Bu saydıklarımız, metotların niteliklerinin azbir kısmıdır. İleride metotların başka hünerlerini örnekler üzerinde görece-ğiz.

Ruby’de metot def anahtar sözcüğünü ile ile başlar end anahtar söz-cüğü ile biter. def sözcüğünü metot adı izler.

Örnekler:

Liste 3.7.

1 d e f selamputs " Merhaba dostum ! "

end

Bu selam veren kısa bir metottur. İlk satır ile son satır arasında kalanbölgeye metodun gövdesi denilir. Bu metodun gövdesi bir tek deyim içeriyor.Ama uzun metotlar da böyle yazılır. Aralarındaki fark, gövdeye daha çokdeyim yazılmasıdır.

Liste 3.8.

d e f selam2 puts " Merhaba dostum ! " . downcase

end

Page 7: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.6. METOTLAR 21

Metot adından sonra varsa metodun parametreleri yazılır. Paramet-releri tırnak içine alma zorunluğu yoktur ; aynı satıra yazılırlar, aralarına(,) konulur.

3.6.1 Metot Parametreleri ve Yerel Değişkenler

Bir metot tanımında iki türlü değişken kullanılabilir: parametreler ve yereldeğişkenler. Parametrelere argüman (argument) da denilir. Bu kavramlarıgene bir örnek üzerinde açıklayacağız.

Liste 3.9.

d e f g e l i r _ v e r g i s i _ h e s a p l a ( g e l i r )2 g e l i r _ v e r g i s i _ o r a n i = 35

b r u t _ g e l i r = g e l i rp g e l i r _ v e r g i s i = b r u t _ g e l i r ∗ g e l i r _ v e r g i s i _ o r a n i / 100 .0p net_kazanc = b r u t _ g e l i r − g e l i r _ v e r g i s i

end

7

g e l i r _ v e r g i s i _ h e s a p l a (50 _000 )

Metot adından sonra () içinde yazılan gelir adlı değişkene bilgisa-yar jargonunda parametre ya da argument denilir. Birden çok parametrevarsa, onlar arasına virgül konulur. Fonksiyonun gövdesinde yer alan ge-lir_vergisi_oranı, brüt_gelir, gelir_vergisi ve net_kazanç değişkenlerineyerel değişkenler denilir.

Parametreleri parantez içine almak gerekmez; ama metot adının bu-lunduğu satıra yazılmalıdır.

Parametreli metot çağrılırken, parametrelere gerçek değerler konu-lur. Örneğin, yukarıdaki metodu çağırırken gelir_vergisi_hesapla (50000)yazılırsa, 50000 liralık brüt kazanç için, gövdede istenen gelir_vergisi venet_kazanç hesaplanır. Parametre değer(ler)i, gerekiyorsa gövde içindekiyerel değişken(ler)e de atanabilir ya da gövde içindeki ifadelrde kullanılabi-lir. Bu örnekte, gelir parametresinin değeri brüt_gelir adlı yerel değişkeneaktarılmaktadır. Ruby metotlarında return anahtar sözcüğünü kullanmazorunluğu yoktur. Son deyimdeki değer, metodun return değeridir. Amaöteki dillerden alışkanlık kazananlar return kullanabilirler.

Basamak sayısı çok olan sayıların kolay algılanırlığını sağlamak için,sayının binlik blokları arasına alt çizgi (_) konulabilir. Örneğin, yukarıdakimetodu çağırırken gelir_vergisi_hesapla (50000) yerine gelir_vergisi_hesapla(50_000) yazılmıştır.

Page 8: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

22 BÖLÜM 3. RUBY SINIFLARI

3.6.2 Metot Çağırma

Anlık (instance) metotlar, ait oldukları nesne içinden çağrılabilir. Modulemetotları module adını izleyen nokta bağlacı ve onu izleyen metot adı ileçağrılır. Varsa metodun parametreleri yerine gerçek literal değerler yazılır:

module_adı . metot_adı2

module_adı . metot_adı ( " Ankara " )

Bazen kısaltmalar yapılabilir. Örneğin,f oo ( ∗ [ 1 , 2 , 3 ] )

deyimif oo ( 1 , 2 , 3 )

yerine geçer.

3.7 Sınıf Bildirimi

Sınıf bildirimi için söz dizimi basittir. class anahtar sözcüğünü izleyen sı-nıf_adı yazılır. Sınıf gövdesi oluşturulduktan sonra end satırı yazılarak sınıfbildirimi sonlandırılır. Örneğin

Liste 3.10.

c l a s s Tamtakırend

deyimleri boş bir sınıf yaratır. Boş sınıf, doğal olarak, bize yararlı işleryapmaz. Ama, her sınıf Ruby’de Object sınıfının altsınıfıdır. Dolayısıyla,yukarıdaki Tamtakır sınıfı, Object sınıfının özniteliklerine ve metotlarınakalıtsal olarak sahiptir. Tamtakır sınıfından bir nesne yaratmak için newoperatörünü kullanırız.

Liste 3.11.

boş = Tamtakır . new

Bu deyim, Tamtakır sınıfına ait bir nesne (instance) yaratmıştır. Nesneyaratmak demek, teknik olarak, ana bellekte ona yetecek kadar bir yerintahsis edilmesi demektir. Bir değişkene ana bellekte yer ayrılmasına benzer.

Sınıflardan üretilen bütün nesneler ana bellekte heap denilen bölgeyekonulurlar. Ruby’nin heap düzenlemesi bu kitabın konusu değildir. Prog-ramcı sınıftan nesne yaratınca, Ruby onu ana bellekte uygun yere konuş-landırır.

Page 9: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.8. RUBY’DE SINIFLAR VE NESNELER 23

Her nesnenin bir adı vardır. O ad, aslında, nesnenin ana bellektekiadresini gösteren bir işaretçidir (reference, pointer). Bir sınıftan istenildiğikadar nesne türetilebilir. Onlar heap’te farklı adreslere konulur. Her nesne-nin kendi pointeri vardır.

Yukarıdaki Tamtakır sınıfından türetilen nesnenin ana bellekteki ad-resini gösteren pointerin adına boş dedik. Pointere istediğimiz adı verebi-liriz. Pointer aynı zamanda nesnenin adı rolünü de üstlenir. Programcı,nesnenin adresini bilmek zorunda değildir. Nesnenin pointeri, daima işaretettiği nesnenin adresini bilir.

Bir sınıftan yaratılan bütün nesneler heap’te konuşlanır. Büyük prog-ramlarda nesne gerektiğinde yaratılır ve işi bitince silinir. Böylece heap’tegereksiz yer işgali olmaz.

Ruby’de sınıf adı bir sabit’tir. Sabitler büyük harfle başladığı için,sınıf adları daima büyük harfle başlar.

Yukarıda yarattığımız boş nesnesi, her nesne gibi, Object sınıfının herşeyine kalıtsal olarak sahiptir. class metodu Object sınıfının bir metodudur.Nesnenin hangi sınıftan üretildiğini bildirir. Örneğin,

Liste 3.12.

puts ( boş . c l a s s ) #=> Tamtakır

deyiminin çıktısı boş pointerinin işaret ettiği nesnenin Tamtakır sınıfındanüretildiğini söylüyor.

3.8 Ruby’de Sınıflar ve Nesneler

Ruby nesne tabanlı bir dildir. "Ruby’de her şey nesnedir" sözünü sık sıkduyarız. Burada "Peki ama sınıflar da nesne midir?" sorusu akla gelmeli-dir. Evet, Ruby’de sınıflar da birer nesnedirler. Çünkü sınıflar da sıradü-zenin (hierarchy) en tepesinde yer alan BasicObject nesnesinden türetilir.BasicObject’in altında Object nesnesi yer alır. Örneğin, "abc" stringi deString sınıfı da birer nesnedir. Aralarındaki fark String’in ayrıca sınıf olarakdavranıyor olmasıdır. Başka bir deyişle,

Ruby’de her sınıf bir nesnedir, ama her nesne bir sınıf değildir.

Sınıf nesne tabanlı programlamanın başlıca aracıdır. Her sınıf birveri tipidir. Her veri tipi bir sınıftır. Ruby’de her şey bir nesne olduğunagöre, her nesneyi türeten bir sınıf vardır.

Page 10: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

24 BÖLÜM 3. RUBY SINIFLARI

Genel olarak, nesne tabanlı dillerde sınıf, altsınıf ve üstsınıf kav-ramlarını Bölüm 2 ’te açıklamıştık. Bu bölümde sınıf, altsınıf ve üstsınıfkavramları ile kalıtım özeliklerini Ruby sözdizimini kullanarak basitçe açık-layacağız.

Örnekler

Ruby’de sınıf bildiriminin class anahtar sözcüğü ile başlayıp end anahtarsözcüğü ile bittiğini söyledik. class anahtar sözcüğünü sınıf adı izler. Sınıfadı büyük harfle başlar. Büyük harfle başlayan adlar Ruby’de sabit’tir. Onedenle, sınıf adı Ruby’de sabittir. Örneğin,

Örnek 3.1.

c l a s s B i t k id e f ad_ver ( i s im )

@bitki_adı = is im4 end

end

Liste 3.1, Bitki adlı bir sınıf bildirimidir. Bildirimin ilk satırı ile son satırıarasındakilere sınıfın gövdesi denilir. Bu örnekte sınıf gövdesinde yalnızcaad_ver adlı bir metot bildirimi vardır. ad_ver metodunun tek parametresivardır: isim. Metodun görevi, bu parametrenin değerini @bitki_adı adlıdeğişkene aktarmaktır.

Anlık Değişken Önünde @ simgesi olan değişkenlere anlık (üretik, tü-retik instance) değişkenler denilir. Anlık değişken, nesne yaratılırken nesneiçinde yaratılır, nesne yok olurken yok olur. Anlık denmesinin nedeni budur.Öte yandan, sınıftan üretilen bir nesne içindedir. O nedenle üretik değişkendiyoruz.

Anlık değişkenlere, ait oldukları nesne dışından erişilemez. Her anlıkdeğişken işlevini ait olduğu kendi nesnesi içinde yapar.

3.9 Sınıftan Nesne Yaratma

Bir sınıftan nesne yaratmak için new operatörü kullanılır. Alışılmış olduğuiçin operatör diyoruz. Ama her operatör bir metottur ve bir Ruby nesne-sidir. new metodu, bütün sınıflara uygulanabilir; yani her sınıftan nesneüretebilir.

Örnek 3.2.

Page 11: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.9. SINIFTAN NESNE YARATMA 25

b1 = B i t k i . new

Liste 3.2, Bitki sınıfından b1 adlı bir nesne üretiyor. b1 üretilen nesneninadıdır. Daha doğrusu, nesnenin ana bellekteki adresini işaret eden poin-ter ’dir.

Bir sınıftan birden çok nesne üretilebilir:

Örnek 3.3.

b2 = B i t k i . new

Liste 3.3, Bitki sınıfından b2 adlı başka bir nesne üretiyor. Bunların farklıolduğunu görmek için

b1 == b2 # => false

deyiminin false değer verişinden anlarız. Gerçekten onlar ana bellekte farklıadreslere konuşlanmışlardır.

b1 ve b2 nesneleri birbirlerinden farklı olduğuna göre, her birisininkendi gövdelerindeki anlık değişkenlere farklı değerler atanabilir. Örneğin,

Örnek 3.4.

b1 . ad_ver ( elma )b2 . ad_ver ( k i r a z )

deyimleri b1 ve b2 nesneleri içinde bitkilere, sırasıyla, elma ve kiraz adlarınıverirler.

Şimdi bu deyimleri bitkiler.rb adlı bir dosya haline getirip, program-larımızı içeren RubyKaynak dizinine kaydedelim.

Program 3.1.

c l a s s B i t k id e f ad_ver ( i s im )

3 @bitki_adı = is imend

end

b1 = B i t k i . new8 b2 = B i t k i . new

b1 . ad_ver ( ’ elma ’ )b2 . ad_ver ( ’ k i r a z ’ )

Program 3.1 ile verilen kaynak programı derleyip koşturmak için, daha önceyaptığımız gibi,

ruby b i t k i l e r . rb

Page 12: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

26 BÖLÜM 3. RUBY SINIFLARI

komutunu yazalım. Konsolda metotlarımızın çalıştığını gösteren bir işaretgörmeyiz. Ama, her şeyi doğru yaptıysak, Ruby bize bir hata uyarısı dagöndermez. Böyle oluşu, programımızın çalıştığını gösterir. Gerçekte, prog-ramımız istenilen işleri yapmıştır. Konsola bir şey yazılmasını istemediğinegöre, olan biten her şeyi olağan saymalıyız.

Şimdi sınıfımıza yeni metotlar ekleyeceğiz.

Bir sınıfın içinde istediğimiz kadar değişken ve metot bildirimi yapa-biliriz. Örneğin, Liste 3.1 ile bildirilen Bitki sınıfına ad_yaz adlı yeni birmetot ekleyelim:

Örnek 3.5.

c l a s s B i t k id e f ad_ver ( i s im )

@bitki_adı = is im4 end

d e f ad_yazr e t u r n @bitki_adı

end

9 end

Burada, Bitki sınıfına ad_yaz adlı yeni bir metot eklenmiştir. Bu metotad_ver metodunun @bitki_adı adlı anlık değişkene atadığı isim değerini ya-zacaktır. Bu metodun parametresi yoktur; çünkü işlevine bakarsak, metotçağrılırken bir parametreye gerek kalmıyor. Başka metotlar için parametregerekebilir.

Ruby’de return değerini yazma zorunluğu olmadığını söylemiştik.Bir metodun gövdesinde bulunan son değer o metodun return değeridir.Ama algılanırlığı kolaylaştırmak için, burada metodun bize vereceği değerireturn anahtar sözcüğü ile belirliyoruz. İyice ustalaşana kadar böyle yap-makta sakınca yoktur.

Şimdi yaptığımız eklerle programı yeniden yazıp bitkiler2.rb adıylakaydedelim. Verdiğimiz bitki adlarını yazdırabilmek umuduyla, programınsonuna puts metodunu elma ve kiraz için ayrı ayrı ekleyelim.

Program 3.2.

1 c l a s s B i t k id e f ad_ver ( i s im )

@bitki_adı = is imend

6 d e f ad_yazr e t u r n @bitki_adı

end

Page 13: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.9. SINIFTAN NESNE YARATMA 27

end

11 b1 = B i t k i . newb2 = B i t k i . new

b1 . ad_ver ( ’ elma ’ )b2 . ad_ver ( ’ k i r a z ’ )

16

puts ( b1 . ad_yaz )puts ( b2 . ad_yaz )

Program 3.2’yi koşturunca Ruby konsola

Örnek 3.6.

elma2 k i r a z

stringlerini yazar. Son iki satırdaki puts metodunun b1 nesnesindeki ad_yazmetodunu çağırdığını; son satırdaki puts metodunun da b2 nesnesindekiad_yaz metodunu çağırdığını görüyoruz.

initialize Metodu

Program 3.3 ile bildirimi yapılan Bitki sınıfına ait nesneler yaratılınca, anlıkdeğişkenlere değer atamak için ad_ver metodunu kullandık. Nesne tabanlıprogramlamada anlık değişkenlere değer atayan metoda verici (setter),değer okuyan metoda da alıcı (getter) denilir. Anlık değişkenlerin herbirisi için bu işin tek tek yapılması mümkün ama zaman alıcıdır. Bununyerine, Ruby initilize metodunu kullanarak anlık değişkenlere nesne ya-ratılırken değerleri atayabilir. Anlık değişkenlere değer atanmadan kullanıl-malarını da önlediği için initilize metodu tercih edilmelidir.

Program 3.3’de Bitki ve Hayvan adlı iki sınıf bildirimi var. İlk sı-nıftaki anlık değişkenlere verici yöntemiyle değer atanırken, ikinci sınıfınnesnelerine initialize yöntemi ile değer atanmaktadır. İkinci yöntemin dahakolay olduğu görülüyor.

Program 3.3.

# Ruby örnek programlar ı# i k i s ı n ı f b i l d i r i m i ve onlardan nesne üretme

3

c l a s s B i t k id e f ad_ver ( i s im )

@bitki_adı = is im8 end

Page 14: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

28 BÖLÜM 3. RUBY SINIFLARI

d e f ad_yazr e t u r n @bitki_adı

end

13 end

c l a s s Hayvand e f i n i t i a l i z e ( hAd , h N i t e l i k )

@hayvan_adı = hAd18 @ n i t e l i k = h N i t e l i k

end

d e f to_s # d e f a u l t to_s metodunu b a s k ı l a ( o v e r r i d e )" Hayvanın adı : #{@ad} , ö z e l l i ğ i : #{@ n i t e l i k }\n "

23 end

end

b i t k i 1 = B i t k i . new28 b i t k i 1 . ad_ver ( " Gül " )

puts b i t k i 1 . ad_yaz

h1 = Hayvan . new( "At " , " Çağlar boyunca insana dost olmuştur . " )h2 = Hayvan . new( " Aslan " , " Vahşi b i r hayvandır . " )

33 puts h1 . to_sputs h2 . to_s

# i n s p e c t metodu nesnenin i ç i n i g ö s t e r i rputs " B i r i n c i hayvanın ö z e l i ğ i : #{h1 . i n s p e c t } "

38 puts " İ k i n c i hayvanın ö z e l i ğ i : #{h2 . i n s p e c t } "

Bu programın çıktısı konsolda şöyle görünür:

Liste 3.13.

>ruby bitkiVehayvan . rb2 Gül

Hayvanın adı : At , ö z e l l i ğ i : Çağlar boyunca insana dost olmuştur .Hayvanın adı : Aslan , ö z e l l i ğ i : Vahşi b i r hayvandır .B i r i n c i hayvanın ö z e l i ğ i : #<Hayvan : 0 x007fb5aa2195f0 @ad="At " ,

@ n i t e l i k ="Çağlar boyunca insana dost olmuştur ." >İ k i n c i hayvanın ö z e l i ğ i : #<Hayvan : 0 x007fb5aa219578 @ad="Aslan " ,

@ n i t e l i k ="Vahşi b i r hayvandır ." >

inspect Metodu

inspect metodu bir nesne içine bakmaya yarayan bir metottur. Program3.3’nin son iki satırında metodun kullanılışını görüyoruz. Metodun verdiğisonuç Liste 3.13’nin 5-8.satırlarında görülüyor. Çıktı, sınıf adından sonra(:) yi izleyen bir sayı ve onun arkasından da nesne ile ilgili nitelemeyi verir.Sözkonusu sayısal değer sistemden sisteme değişir; sistemin sınıfa verdiğinumaradır. Pointer rolünü oynar.

Page 15: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.10. SINGLETON 29

to_s Metodu

to_s metodu her nesneye uygulanır ve onu string olarak yazar. Örneğin,

Program 3.4.

1 . to_s => " 1 "[ 1 , 2 , 3 ] . to_s => " [ 1 , 2 , 3 ] "c l a s s Kimlik ; end

4 Kimlik . new . to_s => "#<Kimlik : 0 x007fa8f4173ed8>"

3.10 Singleton

Bir sınıftan yalnızca bir tek nesne üretilmesini sağlar. Örneğin, true, false

ve nil nesneleri böyledir.

Program 3.5.

1 r e q u i r e ’ s i n g l e t o n ’

c l a s s Denemei n c l u d e S i n g l e t o n

end

sınıfı tanımlandıktan sonra, nesne üretmek için izlediğimiz yolu izleyip,

Deneme.new

deyimi ile bir nesne üretmek istersek,

# => NoMethodError : p r i v a t e method ‘new ’ c a l l e d f o r Deneme : Class

uyarısı alırız. İstediğimiz nesneyi yaratabilmek için, instance() metodunukullanmalıyız.

Program 3.6.

r e q u i r e ’ s i n g l e t o n ’

c l a s s Deneme4 i n c l u d e S i n g l e t o n

d e f ver i_ver ( v )@veri = v

end

9

d e f ver i_a l ; @veri ; end

d e f v e r s i o n’ 1 . 0 . 0 ’

Page 16: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

30 BÖLÜM 3. RUBY SINIFLARI

14 end

end

obj1 = Deneme . i n s t a n c eobj2 = Deneme . i n s t a n c e

19 puts obj1 == obj2

obj1 . ver i_ver (123)puts obj1 . ve r i_a lputs obj1 . v e r s i o n

24

obj2 . ver i_ver (456)puts obj2 . ve r i_a lputs obj2 . v e r s i o n

29 puts obj1 . ve r i_a l

1 /∗∗t rue1231 . 0 . 0456

6 1 . 0 . 0∗/

Açıklamalar: 19.satır, Deneme sınıfından obj1 adlı bir nesne üretiyor. 20.sa-tır, Deneme sınıfından obj2 adlı bir nesne üretiyor. (Singleton sınıf olduğun-dan, ikinci bir nesne üretilememeli.) 21.satır. üretilen iki nesnenin aynı olupolmadığını denetliyor. Çıktı true oluyor. Bu demektir ki, obj1 ile obj2 aynınesnelerdir. O halde, ikinci bir nesne üretilememiştir. İkinci nesne birincinesne ile çakışmıştır. 23.ve 27. satırlar nesnede veri değişkenine farklı de-ğerler atıyor. 24. ve 28. satırlar bu değerleri yazdıryor. 25. ve 29. satırlarnesnede version (sürüm) metodunu çalıştırıyorlar. Aynı sonucu alıyorlar.28.satırda obj1’e atanan değer yazdırılıyor. Ama bu değerin 24.satırda ya-pılan değişikliği yansıttığını görüyoruz. Bu da singleton sınıftan iki nesneüretilemediğinin başka bir kanıtıdır.

3.11 Sınıfların Sıradüzeni

Program 3.3 ’de Bitki ve Hayvan sınıflarının bildirimini yaptık. Her ikisınıfta anlık bitki_adı ve hayvan_adı değişkenlerini kullandık. Bu adlaradeğer atamak için verici (setter) metotlarını ve verilen adlara ulaşmak içinalıcı (getter) metotlarını her sınıf için ayrı ayrı yazdık. Sonuçta yazdığı-mız programlar çalıştı. Bir sorun olmadı. Ama her iki sınıfta yapılan işlerbirbirinin aynıdır. Acaba bu işleri iki kez yapmaktansa, bir kez yapmanınbir yolu olabilir mi? sorusu aklımıza geliyor. Nesne tabanlı programlamadabu mümkündür; üstelik nesne tabanlı programlamada kalıtım (inheritance)

Page 17: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.12. ALTSINIF BILDIRIMI 31

diye bilinen çok önemli bir niteliktir.

3.12 Altsınıf Bildirimi

Bir A sınıfının B adlı alt sınıfını tanımlamak için

class B < A end

sözdizimi kullanıldığını söylemiştik.

Program 3.7.

c l a s s Aend

3

c l a s s B < Aend

B. is_a ? A8 => f a l s e

B. s u p e r c l a s s == A=> t r u e

13 B < A # => trueA < A # => f a l s e

or use the <= operator

18 B <= A # => trueA <= A # => true

B. a n c e s t o r s . i n c l u d e ? A

Açıklamalar: 1 ve 2.satırlar boş A sınıfını tanımlıyor. 4. ve 5. satırlar B alt-sınıfını tanımlıyor. 7.satır B nin A olup olmadığını soruyor ve false yanıtınıalıyor. 10.satır B nin üst sınıfının A olup olmadığını soruyor ve true yanı-tını alıyor. 13. satır B nin A nın altsınıfı olup olmadığını soruyor ve trueyanıtını alıyor. 14.satır A nın B sınıfının altsınıfı olup olmadığını soruyorve false yanıtını alıyor. 18.satır satır B nin A nın altsınıfı ya da A ya eşitolup olmadığını soruyor ve true yanıtını alıyor. 19.satır satır A sınıfının, Anın altsınıfı ya da A ya eşit olup olmadığını soruyor ve true yanıtını alı-yor. 21.satır B nin atasının A yı içerip içermediğini soruyor ve true yanıtınıalıyor.

Program 3.8’de bir sınıfın kendisyle ilişkisi açıklanıyor:

Program 3.8.

Page 18: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

32 BÖLÜM 3. RUBY SINIFLARI

B. a n c e s t o r s#=> [B, A, Object , Kernel , Bas icObject ]

4 B < B#=> f a l s e

B. a n c e s t o r s . i n c l u d e ? B#=> true

Açıklamalar:

1.satır B nin atalarını listeliyor 4.satır b nin kendi kendisinin bir alt-sınıfı olmadığını söylüyor. 7.satır, B nin atalarının B yi içerdiğini söylüyor.

Kalıtımın Özelikleri

• Kalıtım, sınıflar sıradüzeninde (hierarchy), ataların bütün öğelerininoğullara geçmesi olayıdır.

• Bir sınıfın öğeleri deyince, o sınıf içindeki değişkenleri ve metotlarıanlayacağız.

• Bir sınıf bir altsınıf doğurabilir. Doğurulan sınıfa altsınıf, doğuransınıfa üstsınıf ya da super sınıf denilir.

• Altsınıf, üstsınıfın bütün öğelerine sahip olur. Buna kalıtım (inheri-tance) özeliği denilir.

• Altsınıf, üstsınıftan gelen öğelere ek olarak kendi değişkenlerini vemetotlarını tanımlayabilir. Tanımlanan yeni öğeler oğullarına aynengeçer, ama atalarına geçmez. Sosyal yaşamdaki miras gibidir.

• Bir sınıf birden çok altsınıf doğurabilir. Ama bir sınıfı doğuran üstsınıfbir tanedir.

• Altsınıf başka altsınıflar doğurabilir. Böylece sınıflar arasında yukarı-dan aşağıya doğru giden bir sıradüzen (hierarchy) oluşur. Bu sıradü-zende, bir sınıfın üstünde yer alanlara ata sınıflar (ancestor), altındayer alan sınıflara da oğul sınıflar (decendant) denilir.

Daha önce tanımladığımız, Bitki ve Hayvan sınıfları için Varlık adlıbir üstsınıf tanımlayalım:

Program 3.9.

Page 19: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.12. ALTSINIF BILDIRIMI 33

c l a s s Var l ık2 d e f ad_ver ( i s im )

@ad = is imend

d e f ad_yaz7 r e t u r n @ad

end

end

Bitki ve Hayvan sınıflarının öğelerini Varlık sınıfına taşıdığımıza göre, onlarıtekrarlamaya gerek yoktur. Ancak, altsınıflarda gerekiyorsa başka öğelertanımlayabiliriz. Bir sınıftan başka bir sınıfı doğurtmak için küçük (<)karekteri kullanılır. Örneğin,

B < A

deyimi, A sınıfından B sınıfını doğurur. A üstsınıf, B altsınıf olur. Üstsı-nıfa super adı da verilir. Buna göre, şimdi Varlık sınıfının Bitki ve Hayvansınıflarını doğurması için aşağıdaki kodları yazalım:

Liste 3.14.

1 c l a s s B i t k i < Var l ıkd e f ad_ver ( i s im )

s u p e r

end

6 d e f ad_yazsu p e r

end

d e f meyve_verir_mi (b)11 @meyve = b

end

d e f cevapr e t u r n @meyve

16 end

end

Liste 3.14’de yapılanları açıklayalım. 2-4.satırlar Varlık üstsınıfında bildi-rimi yapılan ad_ver metodunun tanımının üstsınıftan (super) aynen alına-cağını belirtiyor. 6-8.satırlar aynı eylemi ad_yaz metodu için yapmaktadır.10-12.satırlar Bitki altsınıfının meyve_verir_mi adlı yeni bir metodunu ta-nımlanıyor. 14-17.satırlarda ise cevap adlı yeni metodu tanımlanıyor.

Hayvan altsınıfı için de benzer eylemleri yapalım.

Liste 3.15.

c l a s s Hayvan < Var l ık

Page 20: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

34 BÖLÜM 3. RUBY SINIFLARI

d e f ad_ver ( i s im )3 s u p e r

end

d e f ad_yazsu p e r

8 end

d e f eti_yenir_mi ( e )@et = e

end

13

d e f yan ı tr e t u r n @et

end

end

Şimdi bunları bir araya getirerek programımızı Program 3.10 gibi yazabili-riz.

Üstsınıftan Metot Çağırma

Program 3.10.

# encoding : UTF−8# üst s ı n ı f t a n metot çağırma ( ruby 1 .9 ö n c e s i )

3

c l a s s Var l ıkd e f ad_ver ( i s im )

@ad = is imend

8

d e f ad_yazr e t u r n @ad

end

end

13

c l a s s B i t k i < Var l ıkd e f ad_ver ( i s im )

s u p e r

end

18

d e f ad_yazsu p e r

end

23 d e f meyve_verir_mi (b)@meyve = b

end

d e f cevap28 r e t u r n @meyve

end

end

Page 21: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.12. ALTSINIF BILDIRIMI 35

c l a s s Hayvan < Var l ık33 d e f ad_ver ( i s im )

s u p e r

end

d e f ad_yaz38 su p e r

end

d e f eti_yenir_mi ( e )@et = e

43 end

d e f yan ı tr e t u r n @et

end

48 end

b i t k i = B i t k i . newhayvan = Hayvan . new

53 b i t k i . ad_ver ( ’ elma ’ )b i t k i . meyve_verir_mi ( ’ evet ’ )p r i n t " B i t k i ad ı : "puts ( b i t k i . ad_yaz )p r i n t " Meyvesi y e n i r mi? "

58 puts ( b i t k i . cevap )

hayvan . ad_ver ( ’ at ’ )hayvan . eti_yenir_mi ( ’ hay ı r ’ )p r i n t " Hayvan adı : "

63 puts ( hayvan . ad_yaz )p r i n t " Et i y e n i r mi? "puts ( hayvan . yan ı t )

Programın çıktısı şöyledir:B i t k i ad ı : elmaMeyvesi y e n i r mi? evetHayvan adı : atEt i y e n i r mi? hay ı r

Program 3.11.

1 #! encoding UTF−8# üst s ı n ı f t a n metot çağırma ( ruby 1 .9 s o n r a s ı )

c l a s s Var l ıkd e f ad_ver ( i s im )

6 @ad = is imend

d e f ad_yazr e t u r n @ad

11 end

end

Page 22: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

36 BÖLÜM 3. RUBY SINIFLARI

c l a s s B i t k i < Var l ık@meyve

16 d e f meyve_verir_mi ( bool )@meyve = bool

r e t u r n @meyveend

end

21

c l a s s Hayvan < Var l ıkd e f eti_yenir_mi ( mant ıksa l )

@yenir = mant ıksa lend

26 end

b = B i t k i . newh = Hayvan . new

31 b . ad_ver ( ’Elma Ağacı ’ )h . ad_ver ( ’At ’ )

p r i n t ( " Adı ned i r ? " )puts (b . ad_yaz )

36 p r i n t " Meyve v e r i r mi ? "puts b . meyve_verir_mi ( ’ Evet ’ )

p r i n t " Adı ned i r ? "puts h . ad_yaz

41 p r i n t " Et i y e n i r mi ? "puts h . eti_yenir_mi ( ’ Hayır ’ )

Bu programın çıktısı şöyledir:

>ruby v a r l i k 2 . rbAdı ned i r ? Elma Ağacı

3 Meyve v e r i r mi ? EvetAdı ned i r ? AtEti y e n i r mi ? Hayır

3.13 Baskılama (overriding)

Ata sınıftan gelen bir metodun oğul sınıfta değiştirilmesine baskılama (over-riding) denilir. to_s metodu nesneyi string olarak yazan bir çekirdek me-todudur. Her nesneye uygulanabilir. Atadan gelen her metot için olduğugibi, to_s metodu da baskılanabilir. Program 3.3’nin 21.satırında bildirimiyapılan to_s metodu, atadan gelen aynı adlı metodu baskılıyor. Baskılananmetodun yerini, daima baskın metot alır. Ama ata sınıftakini kullanmak is-tersek, ona özel çağrı gerekir. Çağrı için, Ruby-1.9 ve sonraki sürümlerindeProgram 3.10’de yapılanlara gerek yoktur. Üstsınıfın metotlarını altsınıftaçalıştırmak için Program 3.11’deki gibi yazmak yeterlidir. Bunun ne kadarkolaylık getirdiği, iki programın karşılaştırılmasıyla görülebilir.

Page 23: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.14. UYGULAMALAR 37

Program 3.12.

# Baskılamaya örnek

c l a s s Hazined e f i n i t i a l i z e ( ad , nitem )

5 @isim = ad@ n i t e l i k = nitem

end

d e f to_s # öntan ıml ı to_s metodunu b a s k ı l a r10 " #{@isim} h a z i n e s i t a r i h t e #{@descr ipt ion }\n "

end

end

15 x = " Selam olsun Bolu Bey ’ ine "y = 123z = Hazine . new( " Karun Haz ine s i " , " d e f i n e c i l e r i k e n d i s i n e ç e k m i ş t i r . "

)

p( x )20 p( y )

p( z )

/∗" Selam olsun Bolu Bey ’ ine "123

4 #<Hazine : 0 x007f84c38824e0 @isim="Karun Haz ines i " , @ n i t e l i k ="d e f i n e c i l e r i k e n d i s i n e ç e k m i ş t i r ." >∗/

Buradaki p metodu print metodunun kısa adıdır.

3.14 Uygulamalar

3.14.1 initialize

initialize metodununu daha önce açıklamıştık. Tekrar edersek, anlıkdeğişkenlere değer atamanın kolay bir yoludur. Atamaları nesne yaratılır-ken kendiliğinden yapar. Ayrıca initialize metodunun çağrılmasına ge-rek yoktur. Program 3.11’ de kullanılan verici (setter) metodunun işleviniyapar. Üstelik, anlık değişkenlere nesne yaratılırken atama yapması, prog-ramda onlara değer atanmasının unutulması tehlikesini de ortadan kaldırır.

Program 3.13.

# mobilya . rb

c l a s s Mobilya

Page 24: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

38 BÖLÜM 3. RUBY SINIFLARI

d e f ad_ver ( abc )5 @ad = abc

end

d e f ad_alr e t u r n @ad

10 end

end

c l a s s Koltukd e f i n i t i a l i z e ( abc , b e l i r l e )

15 @ad = abc@niteleme = b e l i r l e

end

d e f to_s # d e f a u l t to_s metodunu b a s k ı l a20 "Bu #{@ad} #{@niteleme } . \n"

end

end

m = Mobilya . new25 m. ad_ver ( " İ t a l y a n yapımı " )

puts m. ad_al

t1 = Koltuk . new( " Koltuk " , " 18 . Lui s t i l i d i r " )t2 = Koltuk . new( " Kaplama " , " Geyik d e r i s i d i r " )

30 puts t1 . to_sputs t2 . to_s# i n s p e c t metodu nesnenin i ç i n e bakmamızı s a ğ l a rputs " B i r i n c i koltuğun ö z e l i k l e r i : #{t1 . i n s p e c t } "

Programın çoktısı şöyledir:İ t a l y a n yapımı

2 Bu Koltuk 18 . Lui s t i l i d i r .Bu Kaplama Geyik d e r i s i d i r .B i r i n c i koltuğun ö z e l i k l e r i : #<Koltuk : 0 x000000027f83f0 @ad="Koltuk " ,@niteleme ="18. Lui s t i l i d i r "

Açıklamalar:

Mobilya üst sınıf, koltuk altsınıftır. Üst sınıfın ver (set) ve al (get)metotları var. 24-26.satırlar üstsınıfın metotlarını çalıştırıyor.

Alt sınıftaki initialize metodu üst sınıftaki set metodunun işlevini gö-rüyor. 28. ve 29.satırlar alt sınıfın iki nesnesini yaratıyor. İnitialize metodunesne yaratılırken kendiliğinden çalışır. Dolayısıyla anlık @ad değişkenine,sırasıyla, Koltuk ve Kaplama değerlerini atıyor. Bu işlem üstsınıftaki verici(ad_ver) metodunu kullanmaya gerek bırakmadığı gibi, nesne yaratılırkenatama yapıldığı için kolaylık sağlıyor. Alt sınıfın ikinci metodu, her sınıftaöntanımlı var olan to_s metodunu baskılıyor. Aslında to_s metodu sınıfınadını yazması gerekirken, burada baskılanırken yapılan 20.satırı yazıyor.Son satırdaki inspect metodu sınıf ile ilgili bilgileri verir. Verdiği bilgilerçıktının son satırında görülüyor. Sınıf adını izleyen numara, sistemin sınıfı

Page 25: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.14. UYGULAMALAR 39

tanıması için verdiği numaradır. Bir tür pointer işlevini görür. Son olarak,initialize metodunun tanımladığı @niteleme adlı anlık değişkene atanan de-ğeri yazıyor.

3.14.2 Baskılama (overriding)

Oğul sınıf, atadan gelen bir metodu aynen kullanabileceği gibi, isterse de-ğiştirerek kullanır. Atadan gelen bir metodun oğul içinde değiştirilmesinemetodun baskılanması (method overriding) denilir. Günlük yaşamda mi-rasçının kendisinine miras kalan bir şeyi, örneğin bir evi, değiştirmesinebenzer.

Program 3.14.

1 c l a s s Yazard e f i ş i _ n e d i r

puts " Yazar lar yaz ı yazar "end

end

6

c l a s s Ozan < Yazard e f i ş i _ n e d i r

puts " Ozanlar ş i i r yazar "end

11 end

c l a s s Romancı < Yazard e f i ş i _ n e d i r

puts " Romancılar roman yazar "16 end

end

ozan = Ozan . newromancı = Romancı . new

21

puts ozan . i ş i _ n e d i rputs romancı . i ş i _ n e d i r

Programın çıktısı şudur:

Ozanlar ş i i r yazar2 Romancılar roman yazar

Açıklama: Program 3.14’de Yazar sınıfının işi_ne adlı bir metodu var. Bumetot iki alt sınıfında ayrı ayrı baskılandı (override). Çıktılardan, değişik-liğin altsınıflara yansıdığı görülüyor.

Program 3.15.

Page 26: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

40 BÖLÜM 3. RUBY SINIFLARI

3 c l a s s Kuşd e f ne_söyler

puts " Her sabah gagamla t ü y l e r i m i temiz l e r im . "end

d e f ne_yapar8 puts " Gökyüzünde özgürce uçarım ! "

end

end

c l a s s Kartal < Kuş13 d e f ne_söyler

puts " Yuvamı yüksek l e rde yaparım . "end

end

18 k = Kartal . newk . ne_söylerk . ne_yapar

Programın çoktısı şöyledir:Yuvamı yüksek l e rde yaparım .Gökyüzünde özgürce uçarım !

Açıklama: Kuş üstsınıfının iki metodu var. ne_söyler adlı metodu altsı-nıfta baskılandı. Ama ne_yapar metoduna dokunulmadı. Çıktıdan görül-düğü gibi, bsakılanan metot yeni işlevini yaparken, baskılanmayan metotüstsınıftaki işlevini yapıyor.

3.15 Üst Sınıftaki Metodu Çağırma

Altsınıfta baskılanan (override) metot yerine baskı geçer. Ama bazan baskıyerine üstsınıftaki asıl metodu kullanmak isteyebiliriz. O zaman super anah-tar sözcüğünü kullanırız.

Examples:

Liste 3.16.

# encoding UTF−82

c l a s s Hayvand e f eylem

" Ben yürürüm ! "end

7 end

c l a s s Kuş < Hayvand e f eylem

" Ben uçarım "

Page 27: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

3.16. OPERATÖRLER 41

12 end

end

puts Hayvan . new . eylemputs Kuş . new . eylem

/∗∗Ben yürürüm !Ben uçarım !

4 ∗/

İsterseniz 11.satır yerine

super + " ve ben uçarım"

koyabilirsiniz. O aman super metodu da çalışır. Deneyiniz.

3.16 Operatörler

Operatörler, matematikte alışkın olduğumuz işlemlere verilen addır. Doğalolarak, programlama dillerindeki veri tiplerine de uygulanıyor. Örneğin,

4+5*6/7

ifadesi toplama, çarpma ve bölme operatörleriyle yapılan bir işlemdir. So-nucu 8 dir.

Ruby operatörleini Bölüm 6’de daha ayrntılı olarak inceleyeceğiz. Bu-rada, yalnızca Ruby’nin alışkanlıklarımız dışında saylabilecek bazı opera-törlerini listelemekle yetineceğiz:

Liste 3.17.

1 : :[ ]∗∗

−( b i r l i , unary ) +( b i r l i , unary ) ! ~∗ , / , %

6 + , −<< , >>&| , ^

> , >= , < , <=11 <=> , == , === ,!= , =~ , ! ~

&&| |. . , . . .=(+=, −=.. .)

16 not

and , or

Operatörlerin çoğu metot’tur. Bazıları sözdizimlerine gömülürler veonlar metot sayılmazlar:

Page 28: Ruby Sınıfları - baskent.edu.trbaskent.edu.tr/~tkaracay/etudio/ders/prg/ruby/ch03/150RubyObjects.pdf · Ruby Sınıfları Bir programlama dilini öğrenirken izlenebilecek en

42 BÖLÜM 3. RUBY SINIFLARI

Liste 3.18.

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

+ = gibi bazı operatörler dile gömülüdür; kullanıcı onları tanımlayamaz.

3.17 Yerleştirme

Değer Gömme, string interpolation

String İçdeğerlemesi (string interpolation) diye anılan bu yöntemi birörnek üzerinde açıklayacağız.

Liste 3.19.

d e f ad_sorp r i n t ( " Adınız ned i r ? " )ad = g e t s ( )

4 puts ( " Merhaba #{ad} " )end

Liste 3.19 ile verilen ad_sor metodu 2.satırdaki print metodu ile kullanı-cının adını soruyor. Burada print metodu yerine puts metodu da kullanı-labilirdi. puts metodu stringi konsola yazdıktan sonra satırbaşı (new line)yapar. Oysa, print metodu metni yazdıktan sonra, yazdığı son karakte-rin sağında durur; satırbaşı yapmaz. 3.satır, gets metodu ile kullanıcınınkonsola gireceği adı alıyor ve onu ad değişkenine atıyor. Bu satır iki işlemyapıyor: Konsola girilen adı akuma ve onu değişkene aktarma.

4.satır önceki metotlardan bildiğimiz işi farklı biçimde yapıyor. puts

metodunun parametresi "Merhaba #{ad}" stringi’dir. puts metodu para-metresindeki stringi konsola yazmakla görevlidir. Ama string içinde ilk kezkarşılaştığımız #{ad} simgeleri yer alıyor. #{...} simgesi ad değişkenineatanan değişken değerini içeren simgedir. Bu simge çift tırnak (" ") içindeverilen bir string içinde kullanılınca, onun tuttuğu değişken değeri, stringdeyer aldığı konuma yazılıyor. Bu özelik Ruby’de string yerleştirme (string in-terpolation) diye anılır. Buna değer gömme de diyebiliriz. Bu yöntem yalnızstring değerleri değil, satırbaşı, tab gibi yazılamaz karakterleri, sayıları,matematiksel ifadeleri ya da program parçalarını da gömebilir.