Ruby'de herşeyin nesne olduğunu önceki günlerden biliyoruz. Peki 2 nesne ve 2 method (fonksiyon) içeren tek satırlık bir kod yazılabilir mi? Cevabı hemen verebiliriz:
puts 2 + 5
Sonucun 7 olduğu aşikar. Peki 2 nesne ve 1 method nerede? Daha önce Ruby'de herşeyin bir nesne olduğunu söylemiştik, Ruby'nin pure-object-oriented bir dil olduğunu da. Burada 2 rakamı bir nesnedir. 5 rakamı da. Evet yanlış duymadınız bunlar birer nesne.
+ operatörü ise bir method, yani fonksiyon.
Peki bu nesneler hangi sınıfa aitler? Neden sınıf ismi kullanmadan çağırdık, sınıf ismi kullansak nasıl olabilirdi? Evet 2 ve 5 rakamları birer nesne dedik, peki hangi sınıfa aitler? Bunu anlamak çok basit, irb'de
2.class komutunu verebilirsiniz, veya bir IDE üzerinde çalışıyorsanız
puts 2.class komutunu verebilirsiniz.
class metodunu bu şekilde hemen her yerde kullanabilirsiniz.
Sonuç ne peki?
Fixnum.
Fixnum bir built-in class'tır, yani Ruby içerisinde gömülü gelen sınıflardan biridir. Rakamlar ise bu sınıfın nesneleridir.
+ operatörünün bir metod yani fonksiyon olduğunuda söylemiştik. Bu operatör iki nesneyi toplama görevini yapan bir methodtur.
Aslında
puts 2+5 yerine,
puts 2.+(5) yazarakta aynı sonucu elde edebilirdik.
class metodu ile sınıf için kullanılan
class'ı karıştırmamak gerekir. Method olan
class; string, integer, fonksiyonlar, değişkenler vb. birçok şeyin hangi sınıfa ait olduğunu söyleyen iş yapıcıdır, yani metodtur. İlerde aşmış bir Ruby programcısı olursak, Fixnum gibi built-in sınıflara kendi methodlarımızı ekleyebilir ve bu modülü geliştirebiliriz de.
Kernel Metodları
Kernel'de aynı
Fixnum gibi özel bir sınıftır. Aslında bu built-in class'lara programlama dilinde biz modül diyoruz. Python tecrübesi olanlar bunu hemen idrak edeceklerdir zaten, Python'da matematik işlemler için
math modülü, işletim sistemi ve dosya işlemleri için
os modülü gibi birçok modül bulunmaktaydı.
Kernel modülünün bir özelliği var, bu özellik sayesinde biz bu modülün metodlarını her sınıf içerisinde rahatlıkla kullanabiliriz.
Örneğin
puts metodu Kernel modülüne ait bir fonksiyodur. Bizim oluşturduğumuz metodlardan farklı olarak
puts metodu bir prefixe ihtiyaç duymuyor, yani bir ön-ad gerekmiyor. Örneğin
Serhat.puts şeklinde kullanmıyoruz puts metodunu. Biz ne zaman
puts fonksiyonunu ansak, Ruby gidiyor
Kernel modülü içerisinden
puts fonksiyonunu bulup kullanıyor, tabi bu işi Ruby'ye yaptırtmak yerine kendimizde yapabiliriz:
Kernel.puts "serhat"
Tam olarak aynı sonucu verecektir, arada herhangi bir farkta yoktur. Aşağıdaki örneklerin tümü aynı işi, aynı şekilde yapmaktadır:
Kernel.puts "serhat" Kernel.puts ("serhat") puts "serhat" puts ("serhat")
Kernel'i teleffuz etmek, külfetli bir iştir ve gerekli değildir, Ruby zaten bu işi bizim yerimize yapıyor olduğu için tekrar tekrar bizim yapmamıza gerek yok.
Peki bu parantezlerde nereden çıktı? Parantez kullanımı zorunlu olmamakla birlikte, birçok metodu birbirine bağladığımızda, kodumuzun daha okunur olması için kullanılmasında fayda olabilir. Ancak bu çok sık karşılaşacağımız bir durum değildir, çünkü puts metodu tek bir argüman alabilir (parametre) ve çok nadir olarak başka metodlara bağlanır.
Arada ki farkı görmek açısından:
puts "Mustafa Serhat Dündar".length
puts ("Mustafa Serhat Dündar").length
İkinci yazım formunun daha açık olduğu kesin, ancak bu kullanım sizin programlama stilinize kalmış. Her şey bir nesne demiştik, peki
Mustafa Serhat Dündar hangi sınıfa ait bir nesne? Hemen bakalım:
puts "Mustafa Serhat Dündar".class > String
Görüldüğü gibi
String sınıfına ait bir nesneymiş.
String Sınıfının Metodları
String sınıfının birçok metodu bulunmakta, bunları örnekle anlamak mümkün olduğu için doğrudan örnekliyorum:
puts "Test" + "Test" > TestTest puts "Test".capitalize > Test puts "Test".downcase > test puts "Test".chop > Tes > puts "Test".next > Tesu puts "Test".reverse > tseT puts "Test".sum > 416 puts "Test".swapcase > tEST puts "Test".upcase > TEST puts "Test".upcase.reverse > TSET puts "Test".upcase.reverse.next > TSEU
Son örneklerde gördüğümüz birçok metodun birbirine bağlanması durumunda parantez kullanımı paydalı olabilir, karışıklığı önleyebilir. Bir çok metod birbirine bağlandığında işlem sırasının soldan-sağa doğru sırayla olduğunu test edebilirsiniz.
OOP Kullanmamak
OOP yöntemlerini kullanmanın zorunlu olmadığını biliyor olmalısınız önceki yazılardan. OOP kullanmadan Ruby kullanabilir miyiz? Evet kullanabiliriz, Python'da OOP bir dildir ancak kullanım zorunluluğu yoktur. Ancak Ruby pure-oop olduğundan OOP kullanımı daha çok öne çıkmaktadır.
def havlamasesi puts "havv havv" end puts havlamasesi
gördüğünüz gibi sadece bu kod parçasını çalıştırabilmemiz mümkün. Burada
havlamasesi metodunu herhangi bir nesneye veya sınıfa bağlamadan doğrudan kullandık. Diğer dillerde bu durumu
procedure,
function,
subfunction - yani "alt program" olarak biliriz.
Bu metodun bir sınıfa bağlı olmadığını söyledik ama Ruby'de herşeyin bir nesne olduğunu ve tamamen OOP bir dil olduğunu söylemiştik, bu tezat değil mi? Aslında şuan biz görmesekte
havlamasesi metodu bir sınıfa bağlı. Fark etmeden,
object sınıfına bağlı bir metod oluşturduk. Denemek mi istiyorsunuz?
Object.havlamasesi kullanmanız yeterli.
Başarılar.