1 Temmuz 2014 Salı

Ruby'de Alt Yordamlar

  1. Alt Yordamlar

Altyordam, belirli bir iş yapan bir dizi program ifadesinin bir birim altında toplanmasıdır. Altyordamlar, farklı programlama dillerinde prosedür, fonksiyon, metot, alt program vb. farklı isimler almaktadır [1].


Altyordam kavramı, Ruby gibi nesneye yönelik programlama dillerindeki metot kavramıyla benzerlik gösterir. Metotlar, çağrım yöntemleri ve sınıflarla ilişkileri bakımından alt yordamlardan farklılık gösterirler [2].


  1. Metotlar

Ruby’de iki parametre alan basit bir metot tanımı ve metodun parametre ile çağrımı gösterilmiştir:


def azalt(deger1, deger2)
 deger1 -= 1
 deger2 -= 1
end

a = 1;
b = 10;
azalt(a, b);
puts a; # Değer değişmez, a=1
puts b; # Değer değişmez, b=10


    • Metot Dönüş Değeri

Ruby’de metotlar return ifadesi ile döndürdükleri değeri belirtmek zorunda değillerdir. Ruby’de metot dönüş değeri metotta işletilen son ifadenin sonucudur [3].


Ruby’de metotlar birden fazla değer dönebilirler [3].


Ruby’de metotlar def ifadesi ile tanımlanır undef ifadesi ile de tanımsız hale getirilebilirler [3].


  1. Metot Argümanları/Parametreleri

Ruby’de basit bir metot tanımı virgüllerle ayrılmış şekilde sayısız parametre alabilir [3].


    • Ön Tanımlı (Default) Parametre Değeri Belirtme

Ruby'de metotta tanımlı parametrelere ön tanımlı (default) bir değer belirtebiliriz. Bu ön tanımlı değerler, metot çağrıldığında işletildiği için dinamik değer de alabilirler [3].


def ilkharfler(s, uzunluk=1)
s[0, uzunluk]
end

ilkharfler("Ruby", 3) # => "Rub"

ilkharfler ("Ruby") # => "R"


    • Opsiyonel Parametreler

Bazen metotlara opsiyonel ve keyfi sayıda parametre verme ihtiyacı olabilir. Ruby’de bunu yapabilmek için bir parametrenin önüne * koymak yeterlidir. Böylece bu opsiyonel parametre sıfır veya daha fazla değere sahip bir dizinin referansı haline gelir [3].


# Maksium değeri bul
def maksimum(ilk, *digerleri)
# İlk verilen değerin en büyük olduğunu kabul et
maks = ilk
# opsiyonel paramterlere daha büyüğünü bulmak için tek tek bak
digerleri.each {|x| maks = x if x > maks }
# En buyuk değeri dön.
maks
end


Yukarıda tanımlı maksimum fonksiyonuna bir dizi parametre olarak verilmek istenirse ve dizinin değerlerinin fonksiyondaki parametrelere sırasıyla dağıtılması istenirse yine * operatörü kullanılabilir [3]. Örneğin:


dizi = [3, 2, 1]
m = maksimum (*dizi) # ilk = 3, digerleri =[2,1] => m=3


    • Blok Fonksiyon Parametresi

Ruby’de fonksiyonlar direkt olarak parametre geçilemese de , blok fonksiyon isimli özel bir çağrım yöntemi ile bir nevi fonksiyon çağrımı yapılabilir [3]. Örneğin:


def seri(n, m, c, &b) # &b: blok fonksiyon
i = 0
while(i < n)
   b.call(i*m + c) # Blok fonksiyonu çağır
   i += 1
end
end

seri(5, 2, 2) {|x| puts x }


    • Parametre Geçirme Yöntemi

Ruby'de fonksiyona verilen parametrenin değeri geçirilir (pass by value) [4]. Genelde karıştırılsa da parametrenin sadece değerinin geçirilmesi nesneler için de geçerlidir. Şöyle ki, nesneler ise aslında gerçek bir değer tutmayıp, hafızada bir referansı tutarlar, fonksiyona parametre olarak da bu referansın değeri geçirilir. Bu sayede nesne üzerinde değişiklik yapılabilir ancak nesne başka bir nesneye atanamaz. Bu açıdan Ruby Java’ya benzer [4,5].


    • Parametre Tipleri ve Tip Kontrolü

Ruby dinamik tipli (dynamically typed) bir dil olduğu için metotlarda parametre tipi belirtilmez. Paramtre tipindeki bir uygunsuz durum ancak parametre işletildiğinde hata verir[6].


    • Fonksiyon Aşırı Yüklemesi (Overloading)

Ruby’de aynı isimli iki fonksiyon tanımlanamaz [7].



[1] "Subroutine”, http://en.wikipedia.org/wiki/Subprogram. [Erişim Tarihi: 23 Mayıs 2014].


[2] Sebesta, R.W., Concepts of Programming Languages, Pearson Education, 2012.


[3] Flanagan D., Matsumoto Y., The Ruby Programming Language, O'Reilly Media, 2008.


[4] “Ruby - Parameters by reference or by value”, 3 Nisan 2014,  http://stackoverflow.com/a/22827949/878710. [Erişim Tarihi: 23 Mayıs 2014].


[5] “Is Java “pass-by-reference” or “pass-by-value”?”, 12 Ağustos 2011,  http://stackoverflow.com/a/7034719/878710. [Erişim Tarihi: 23 Mayıs 2014].


[6] “Ruby Programming/Syntax/Literals”, Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Literals . [Erişim Tarihi: 23 Mayıs 2014].


[7] “Ruby Overloading Methods”, http://rubylearning.com/satishtalim/ruby_overloading_methods.html. [Erişim Tarihi: 23 Mayıs 2014].


NOT: YTÜ - İleri Programlama Dili Dersi 2014 1. Dönem Ödevi Çerçevesinde Hazırlanmıştır.

NOT 2: Ruby 1.9 baz alınmıştır.


Hiç yorum yok: