Ruby Günlüğü – Gün 4

Tüm günlüğe şu adresten ulaşabilirsiniz : http://www.serhatdundar.com/tag/ruby-dersleri

Ruby’de Herşey Nesnedir

Soru? : 2 nesne ve 2 method (fonksiyon) içeren tek satırlık bir kod yazılabilir mi?

Cevabı hemen verebiliriz ;

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, pure-object-oriented bir dil olduğunuda. Burada 2 rakamı bir nesnedir. 5 rakamı da. Evet yanlış duymadınız bunlar birer nesne. + işareti ise bir method, yani fonksiyon.

(Aslında burda bir metod daha bulunmakta, birazdan değineceğiz)

Sorulması gereken güzel soru : Bu nesneler hangi sınıfa aitler? Neden sınıf ismi kullanmadan çağırdık, nasıl olabilir?

Evet 2, 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 nesnesini bu şekilde 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.

“+” işaretinin bir metod yani fonksiyon olduğunuda söylemiştik. İki 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 methodtur.

İ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.

“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 :

Tam olarak aynı sonucu verecektir, arada herhangi bir farkta yoktur. Aşağıda ki örneklerin tümü aynı işi, aynı şekilde yapmaktadır :

Kernel’i teleffuz etmek, külfetli bir iştir ve gerekli değildir, Ruby zaten bu işi bizim yerimize yapıyor, 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;

İ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;

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 :

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.

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 Türkçe’si olarak ise “alt program” olarak biliriz.

Bir sınıfa bağlı olmadığını söyledik bu metodun 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.

İyi günler dilerim.

Mustafa Serhat Dündar

Leave a Reply