Ruby koduna ilk baktığınızda daha önce kullandığınız başka programlama dillerine benzetebilirsiniz. Bu bilerek yapılmıştır. Java, Perl veya Python kullanıcılarına deyimler tanıdık gelecektir. Eğer bunlardan birini kullanmışsanız işiniz çok kolay.
Bu belgede iki ana bölüm var. İlki X dilinden Ruby’ye geçerken ne görmeyi beklediğiniz, ikincisi dilin ana özelliklerini ele alıp önceden bildiklerinizle karşılaştırır.
Neler Değişiyor: X Dilinden Ruby’ye
Önemli Dil Özellikleri ve Bazı İpuçları
Burada Ruby öğrenirken yardımcınız olacak ana Ruby özelliklerini görüyorsunuz.
Yineleme (Iteration)
İki Ruby özelliği, daha önce muhtemelen görmediğiniz ve kullanmaya başlaması
biraz zaman alan, bloklar ve yineleyicilerdir. Bir index üzerinden
döngü yapmak (C, C++ ve 1.5 öncesi Java daki gibi) veya bir liste
üzerinde döngü yapmak (Perl’ün for (@a) {...}
veya Python’un
for i in aList: ...
) yerine Ruby ile genellikle şöyle birşey
görürsünüz:
each
(ve arkadaşları collect
, find
, inject
, sort
, vs.)
hakkında daha fazla bilgi için komut satırında ri Enumerable
(ve sonrasında ri Enumerable#some_method
) yazabilirsiniz.
Herşeyin Bir Değeri Vardır
Bir deyimle bir ifade arasında fark yoktur. Herşey nil de olsa bir değer geri döner. Şu mümkündür:
Semboller Sıradan Stringler Değildir
Ruby’ye yeni başlayan birçok kişi Sembollerin ne olduğunu ve ne için kullanıldıklarını anlamakta zorlanır.
Semboller en iyi kimlikler olarak açıklanabilir. Bir sembolle ilgili
sorulacak olan ne olduğu değil kim olduğudur. Konsolda irb
girin ve farkı görelim:
object_id
metodu bir nesnenin tanımlama kodunu geri döner. Eğer iki nesne birbirine eşitse object_id
leri de eşit olacaktır. Bunun anlamı ikisi de hafıza da aynı yeri işaret ediyor demektir. Gördüğünüz gibi bir sembol ilk defa kullanıldıktan sonra aynı
karakterler her zaman hafızada aynı yeri gösterir. Yani object_id
leri
aynıdır.
Şimdi de (“george”) stringine bakalım. object_id
leri aynı değil. Bunun
anlamı hafızada ayrı iki nesneyi işaret etmekte olmalarıdır. Her nezaman
yeni bir string üretirseniz Ruby onun için bir hafıza ayırır.
Eğer nerede sembol nerede string kullanacağınızdan emin değilseniz, kimliği mi (örn. Hash key) yoksa içeriği mi size gerekli (yukardaki “gearge” gibi) ona göre değerlendirin.
Herşey bir Nesnedir
“Herşey bir nesnedir” lafı diğer dillerdeki gibi abartı bir laf değildir. Sınıflar gibi tamsayılar da bir nesnedir ve diğer nesnelerle yaptığınız herşeyi onlarla da yapabilirsiniz:
Değişken Sabitler
Sabitler tam olarak sabit değil. Eğer halihazırda değeri verilmiş bir sabiti değiştirmeye kalkarsanız bir uyarı mesajı üretir ama çalışmayı durdurmaz. Bu, sabitleri yeniden tanımlamalısınız demek değildir tabii ki.
İsimlendirme Gelenekleri
Ruby bazı isimlendirme geleneklerine zorlar. Eğer bir isim büyük harfle
başlıyorsa, o bir sabittir. Eğer bir dolar işaretiyle başlıyorsa ($
), bu
bir global değişkendir. Eğer @
işaretiyle başlıyorsa bu bir örnek
değişkenidir. Eğer @@
ile başlıyorsa bu bir sınıf değişkenidir.
Metod isimleri de büyük harfle başlayabilir. Bu aşağıdaki gibi bir karışıklığa sebep olabilir:
Burada Constant
10 değerindeyken Constant()
değeri 11 dir.
Anahtar kelime argümanları
Python’daki gibi, Ruby 2.0’dan itibaren, metodlar anahtar kelime argümanları kullanarak tanımlanabilir:
Evrensel Doğruluk
Ruby’de nil ve false dışında herşey doğru kabul edilir. C, Python ve diğer birçok dilde 0 ve boş listeler gibi diğer bazı değerler yanlış kabul edilir. Aşağıdaki Python koduna bakın (diğer dillerde de durum böyledir):
Bunu çıktısı “0 is false” olacaktır. Ruby karşılığı ise:
“0 is true” çıktısı verecektir.
Erişim Belirleyicileri Kısım Sonuna Kadar Geçerlidir
Aşağıdaki Ruby kodunda,
another_method
erişiminin genel olacağını düşünebilirsiniz ama öyle değil. “private” erişim belirleyici sınıf tanımı sonuna kadar veya başka bir erişim belirleyici satıra kadar geçerli olacaktır. Default olarak tüm metodlar “public”(genel erişim)dir:
public
, private
ve protected
aslında metoddur ve bu yüzden parametre alabilirler. Eğer bunlara bir sembol gönderirseniz metodun görünürlüğü değişir.
Metod Erişimleri
Java’da public
, metoda herkes erişebilir demektir. protected
, sınıfın
örneklerinden, türetilmiş sınıfların örneklerinden ve aynı paket
içerisindeki sınıfların örneklerinden erişilebilir demektir. private
ise sınıfın örneklerinden başka kimse metoda ulaşamaz demektir.
Ruby biraz farklılık gösterir. public
doğal olarak herkese açık
demektir. private
ise metodun sadece harici bir alıcı olmadan
çağrılabildiğinde ulaşılabilir olduğunu belirtir. Sadece self
, private bir
metod çağrısının alıcısı olabilir.
protected
incelenmesi gereken birşey. Bir protected metod sınıfın yada türetilmiş sınıfın örneklerinden çağrılabilir, ayrıca diğer örnekler üzerinden çağrılabilir. Örnek, Ruby Dili SSS alınmıştır:
Sınıflar Açıktır
Ruby sınıfları açıktır. İstediğiniz zaman açabilir, ekleme yapabilir,
değiştirebilirsiniz. Çekirdek sınıfları bile, mesela Integer
ve hatta tüm
nesnelerin anası Object
sınıfı dahil. Ruby on Rails Integer
sınıfına
zamanla ilgili bir kısım metod eklemiştir. İzleyin:
Eğlenceli Metod İsimleri
Ruby’de metodların soru veya ünlem işareti ile bitmesine izin verilir.
Gelenek olarak sorulara cevap veren metodlar (örnek,
Array#empty?
eğer alıcısı boşsa true döner) soru işareti
ile biter. Tehlikeli sonuçları olabilecek metodlar (örneğin “kendi”ni ya da argümanlarını
değiştiren metodlar, exit!
gibi) ünlem işareti ile bitirilirler.
Argümanlarını değiştiren tüm metodlar ünlem işareti ile bitmeyebilir.
Array#replace
bir array’in içeriğini diğer biriyle değiştirir
ama ünlemle bitmez. Böyle bir metodun kendini değiştirmemesi pek mantıklı
değil.
Tekil Metodlar
Tekil metodlar, tek nesneye özel metodlardır. Hangi nesne için tanımlandıysa onun için geçerlidir.
Kayıp Metodlar
Ruby bir metodu listesinde bulamayınca vazgeçmez, method_missing
metodunu bulamadığı metod ismi ve argümanları ile çağırır. Normalde
method_missing
bir NameError hatası verir, fakat isterseniz bunu
istediğiniz şekilde değiştirebilirsiniz ve birçok kütüphane de bunu
yapar. Bir örnek:
Yukardaki kod sadece çağrının detaylarını yazdırır, fakat siz mesajı istediğiniz gibi ele almakta serbestsiniz.
Fonksiyon Çağrısı Değil Mesaj İletimi
Bir metod çağrısı aslında diğer bir nesneye bir mesaj dır:
Bloklar Nesnedir, Sadece Henüz Bunu Bilmiyorlar
Bloklar (gerçekte kapamalar) standart kütüphane tarafından çok
kullanılır. Bir bloğu çağırmak için yield
da kullanabilirsiniz,
argüman listesine özel bir argüman ekleyerek bloğu Proc
da yapabilirsiniz.
Şöyleki:
Blokları metod çağrıları dışında da Proc.new
ile veya lambda
metodu
ile üretebilirsiniz
Benzer olarak metodlar da birer nesnedir:
Operatörler sözdizimsel şekerlerdir
Ruby’deki çoğu operatör birbirine belli önceliği olan metod çağrılarıdır. Bu yüzden isterseniz Integer’ın + metodunu değiştirebilirsiniz:
C++’ın operator+
‘ına, vb. ihtiyacınız yok.
Array stili bir erişim için []
ve []=
metodları tanımlayabilirsiniz.
(+1 ve -2 deki gibi) işaretler için +@
ve -@
metodlarını
tanımlamalısınız.
Aşağıdaki operatörler sözdizimsel şeker değillerdir. Bunlar metod değildir ve tekrar tanımlanamazlar:
Ek olarak, +=
, *=
vb. şunların kısaltmasıdır : var = var + other_var
,
var = var * other_var
, vb. ve bu yüzden tekrar tanımlanamazlar.
Daha Fazla Bilgi
Daha fazla bilgiye ihtiyaç duyarsanız Belgeler bölümüne bakınız.