Ruby/Nesnelere giriş
Smalltalk gibi, Ruby de tamamıyla nesne yönelimli bir dildir — her şey bir nesnedir. Bunun aksine C++ ve Java gibi diller dünyalarını nesneler ve primitive tipler arasında bölüştüren melez (hibrit) dillerdir. Bu melez yaklaşım bazı uygulamalarda daha iyi performans verir ama tamamen nesne yönelimli yaklaşım daha tutarlı ve kullanımı kolaydır.
Nesne nedir?
düzenleSmalltalk termniolojisini kullanırsak bir nesne şu üç şeyi yapabilir.
- Diğer nesnelere olan referanslar dahil durmunu korur.
- Hem kendisinden hem de diğer nesnelerden bir mesaj alır.
- Bir mesajın işlenmesi sırasında hem kendisine hem de diğer nesnelere mesajlar gönderir.
Eğer Smalltalk background'unuz yoksa, bu kuralları şöyle değerlendirmek daha anlamlı olacaktır:
- Bir nesne diğer nesnelere olan referanslar dahil veriler içerebilir.
- Bir nesne, verilerine özel erişim sağlayan metodlara sahip olabilir.
- Bir nesnenin metodları diğer metodları/fonksiyonları çağırabilir/çalıştırabilir.
Değişkenler ve nesneler
düzenleNesneleri daha iyi anlamak için bir irb
çalıştıralım.
$ irb --simple-prompt >> comedian = "Stephen Colbert" => "Stephen Colbert"
İlk satırda içeriğinde "Stephen Colbert
" yazısı bulunan bir String nesnesi ürettik. Ayrıca Ruby'ye comedian
isimli değişkenin bu nesneyi gösterdiğini bildiriyoruz.
Şimdi Ruby'ye favorite_comedian
değişkeninin de aynı String nesnesini göstermesini sağlayalım.
>> favorite_comedian = comedian => "Stephen Colbert"
Şimdi aynı String nesnesine referans olarak kullanan iki değişkenimiz mevcut — comedian
ve favorite_comedian
. Her ikisi de aynı nesneyi gösterdiği için eğer nesne değişirse (aşağıda görüldüğü gibi), değişiklik her iki değişkende de yansıyacaktır.
Metodlar
düzenleRuby'de, ismi ünlem işareti ile biten metodlar (ayrıca "bang" adı da verilir) uygulandığı nesneyi değiştirir. Örneğin String nesnenin upcase!
metodu yazının içindeki harfleri büyük harf yapar.
>> comedian.upcase! => "STEPHEN COLBERT"
Değişkenler comedian
ve favorite_comedian
aynı String nesnesini işaret ettiği için, her iki değişkeni de incelesek yazıların büyük harf olduğunu görürüz.
>> comedian => "STEPHEN COLBERT" >> favorite_comedian => "STEPHEN COLBERT"
Ünlem işareti ile bitmeyen metodlar değer dönerler ama nesneyi değiştirmez. Örneğin downcase!
metodu bir String nesnenin tüm harflerini küçük harf yapar, ancak downcase
metodu String nesnedeki yazının küçük harflere dönüştürülmüş bir kopyasını geri döner ama String nesne değişmez.
>> comedian.downcase => "stephen colbert" >> comedian => "STEPHEN COLBERT"
Şimdi aklınıza şu gelebilir, orjinal nesne hala "STEPHEN COLBERT
" yazısı içerdiğine göre tamamı küçük harften oluşan yazı nesnesi nereye konur? Şöyle ki, irb
o içeriği yayınladıktan sonra, bir değişkene de bağlamadığımız için, ona bir daha erişilemez. Esasında o değer artık gitti ve Ruby onu yok edecek.
Bir değişkene tekrar değer vermek
düzenlePeki ya favori komedyeniniz Stephen Colbert değilse? Hadi favorite_comedian
değişkeninin yeni bir nesneyi işaret etmesini sağlayalım.
>> favorite_comedian = "Jon Stewart" => "Jon Stewart"
Şimdi her bir değişken farklı nesneleri gösteriyor.
Kafa karışmış olabilir ama lütfen yavaş yavaş ve anlayarak okuyun.
Diyelim tekrar karar değiştirdik. Şimdi favori komedyenimiz Ellen DeGeneres olsun.
>> favorite_comedian = "Ellen DeGeneres" => "Ellen DeGeneres"
Şimdi hiçbir değişken "Jon Stewart
" String nesnesini işaret etmiyor. Ruby onu da yok edecek.