Ruby Dersleri 3

Başlatan barış, 02 Ocak 2010 - 00:27:09

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

barış

Yield
Aslında bunu geçen derste bloklarla birlikte göstermem gerekiyordu ama unutmuşum. "yield" komutu, fonksiyona eğer bir blok verilmişse, onu çağırır. yield için çağıracağımız blokun argüman olarak belirtilmesi gerekmez.geçen dersteki "ifcan" fonksiyonunda bloku sadece çağırdığımız, onunla başka bir iş yapmadığımız için yield kullanabiliriz. yani yield blok kullanmanın kısayoludur, ama bloku sadece çağırabilirsiniz, başka bir fonkisyona gönderemezsiniz
def ifcan(kosul)
 if kosul
   yield
 end
end


bu da ifcan fonksiyonunun yield ile yazılmış hali.
ayrıca, yield ile bloka değer de yollanabilir. mesela;
def iki_yolla
 yield 2
end

iki_yolla{|x| x+1}
# => 3

burada da yield ile bloka bir argüman yollamayı görüyoruz.

Modüller
Modüler, fonksiyon ve sınıfları gruplamak için kullanılırlar. Diğer programlama dillerinde "namespace" olarak da geçiyor olabilirler.
bir örnek;
module Asd
 PI = 3.141519
 def Asd.merhaba
   puts "modulden merhaba!"
 end
end

Asd.merhaba # "modulden merhaba!" yazdırır
p Asd::PI #3.141519

bir modül içinde fonksiyon tanımlarken, modül ismi.fonksiyon ismi şeklinde tanımlıyoruz. Ayrıca, modüller sabit olduğundan(yani = ile değiştirilemiyorlar) isimlerinin ilk harfleri büyük harf olmak zorunda. Modüllerin sabitlerine de "::" operatörü ile erişebiliyoruz.

Nesne Yönelimli Programlama
Nesne Yönelimli Programlama(OOP), yaklaşık son 20 yıla damgasını vurmuş olan programlama paradigmasıdır. ruby de bunu köküne kadar destekler, hatta fazlasını bile yapar.insan ruby'nin nesne sistemiyle tanıştıktan sonra java'ya "bu da bişey mi?oop değil lan bu" şeklinde bakar oluyor.
Ruby, c++, java gibin diğer object oriented(ımsı) dillerdeki yaklaşık herşeyi içeriyor.mesela bir sınıf örneği
class Merhabaci
 def initialize(isim)
   @isim = isim
 end
 def merhaba_de
   puts "Merhaba, #{isim}
 end
end

m = Merhabaci.new("kuzux")
m.merhaba_de
# "Merhaba, ubuntu" yazdırır.

Burada oldukça basit bir sınıf örneği görüyoruz. "initialize" fonksiyonu, yeni bir obje yaratıldığında çağrılır.constructor dur yani. "@" işareti ile başlayan değişkenlerse o objenin "instance variable" larıdır. üye değişken de diyebiliriz bunlara. sınıfların üye değişkenleri, private'dır, sınıflarda public değişken tanımlanamaz. ancak o değişken için erişim fonksiyonları tanımlanır. sınıf tanımı içinde tanımladığımız fonksiyonlar da üye fonksiyonlar, yani metodlardır.

Erişim metodları
Erişim metodları için örnek;
class Merhabaci
 def isim
   @isim
 end
 def isim= (i)
   @isim = i
 end
end

m.isim #=> "kuzux"
m.isim = "zbdk"
m.merhaba_de #"Merhaba, zbdk" yazdırır.

Bu kodda, çok önemli * bir şey görüyoruz. dilin dinamik yapısını ortaya koyan * bir şey. daha önce tanımladığımız bir sınıfı, tekrar açıp ona birşeyler ekleyebiliyoruz.Bu şekilde sadece kendi yazdığımız sınıfları değil, dilin kendi built-in sınıflarını da değiştirebiliyoruz.Ayrıca, sınıflarda sonu "=" ile biten fonksiyonlar değişkenlere erişim için kullanılır.

hemen yukarıda bahsettiğim sınıflara yeni birşeyler ekleme özelliğine dönersek;
class Integer
 def div_f(other)
   self.to_f/other.to_f
 end
end

yukarıdaki kod, integer sınıfına div_f adında bir fonksiyon ekler ve bununla float olarak bölme yapabiliriz(normalde ruby'de int/int int döndürür). ayrıca burada gördüğümüz self değişkeni, bir sınıftayken o instance'ın kendisini belirtir. c++ daki this gibi yani.


ayrıca, az önce gösterdiğim erişim metodlarını basit bir şekilde tanımlamanın çok kısa bir yolu vardır. o "isim" ve "isim=" fonksiyonları yerine
class Merhabaci
 attr_accessor :isim
end

yazabiliriz. burada attr_accessor, bir değişken için okuma-yazma şeklinde erişim metodları tanımlıyor. aynı şekilde attr_reader sadece okuma, attr_writer da sadece yazma metodu tanımlamakta.

Sınıf Metodları
Sınıf metodları, java ve c++ daki statik metodlar gibidir. sınıfın bir instance'ında değil, doğrudan sınıfta çağrılırlar
class Merhabaci
 def self.merhaba_de(isim)
   puts "Merhaba, #{isim}"
 end
end

Merhabaci.merhaba_de("kuzux")
#Merhaba, kuzux yazdırır

sınıf metodları, sınıf içinde self.metod adı şeklinde tanımlanır. Ayrıca her sınıf da bir obje olduğundan, sınıf metodlarında da sınıfın kendisine erişmek için self kullanabiliriz.

Büyükçene bir örnek
büyükçene: daha önceki örneklere kıyasla
Bir süredir yazdığımız Merhabaci sınıfının tamamı bu da. commentler ile çeşitli kodların ne işe yaradığını yazdım.
class Merhabaci
 attr_accessor :isimler
 
 def self.isim_sor
   puts "Bikac isim girin(bosluklarla ayrilmis)"
   isimler = gets.chomp  # girdi almayı unutmadınız di mi?
   self.new(isimler.split)  # burada yeni bir merhabaci instance i olusturuyoruz.
   # String#split fonksiyonu da belirtilen karakterlerden string i ayırır, bir array döndürür.eğer argümansız kullanılırsa boşluk karakterlerinden ayırır.
 end

 def initialize(isimler)
   if isimler.is_a? String  #burada isimler string mi diye kontrol ediyoruz
     @isimler = isimler.split
   else
     @isimler = isimler
   end
 end

 def isim_ekle(isim)
   @isim << isim  # array'in sonuna ekliyoruz
 end

 def merhaba_de
   @isimler.each do |isim|   #isimler array inin her elemanı için
     puts "Merhaba, #{isim}
   end
 end

 def hoscakal_de
   puts "Hoscakalin, #{@isimler.join(", ")}"
   # join fonksiyonu bir arrayin elemanlarını belirtilen string i aralarına koyarak birbirine ekler.
 end
end


KAYNAK