4
Metotlar
Hemen her programlama dilinde var olan metot kavramı Ruby için de aynıdır. Bazı kaynaklarda metot terimi yerine fonksiyon terimi kullanılır. Bu
kitapta iki terimi eşanlamlı kullanacağız. Ruby metotarının genel sözdizimi
şöyledir ([17], [15]):
Liste 4.1.
d e f metot_adı [ ( [ a r g [= d e f a u l t ] ] . . . [ , ∗ a r g [ , &e x p r ] ] ) ]
deyim ( l e r )
end
Metot bildirimi def anahtar sözcüğü ile başlar, aynı satıra metot adı sonra
varsa metodun parametreleri (arguments) yazılır. Sonra satırbaşı yapılarak
metot gövdesi başlatılır. Metot gövdesine metoda yaptırılacak işleri yapan
deyimler alt alta yazılır. Gövdeye yazılacak deyimler için bir kısıt yoktur. Hiç bir iş yapmayacak metotların gövdesi boş olabilir. Çok iş yapacak
fonksiyonların gövdesine gerektiği kadar deyim yazılabilir. Deyimleri birbirlerinden ayırmak için ya her deyim ayrı bir satıra yazılır ya da deyimler
arasına (;) konulur. En son satıra end anahtar sözcüğü konulur. end, metot
bildiriminin bitiş yeridir.
Ruby metotları değer veren (return) ya da değer vermeyen metotlar diye ikiye ayrılabilir. değer vermeyenler, bazı dillerdeki procedure diye
adlandırılan yapının rolünü oynar. Metot tek ya da çoklu değer verebilir
(return values).
Genel kural olarak, bir metoda bir tek iş yaptırmalıyız. Böylece metodun taşınabilirliği sağlandığı gibi, güncellenmesi de kolay olur. Tabii, bir
metoda birden çok iş yaptıracak deyimlerin yazılması mümkündür, ama bu
iyi bir yöntem değildir.
44
BÖLÜM 4. METOTLAR
Metodun vereceği değeri, gövdenin son satırında return anahtar terimi ile belirtmek mümkündür. Ama Ruby buna gerek duymaz; gövdedeki
son satır değerini return değeri olarak verir.
Bilgisayar dillerinde, metot adını izleyen () içine yazılan değişkenlere
parametreler (parameters) ya da argümanlar (arguments) denilir. Fonksiyon gövdesi içine öntakısız yazılan değişkenlere de yerel değişken adı verilir.
Argümanlara fonsiyon çağrılırken gerçek değerler atanır. Yerel değişkenler,
içinde oldukları ifadeye göre değer alırlar. Yerel değişkenlerin kapsanma
alanı (scope) yalnızca içinde bulundukları metodun gövdesidir. Fonksiyonun yerel değişkenlerine dışarıdan erişilemez.
4.1
Metot Sözdizimleri
Ruby metot bildiriminde farklı sözdizimleri (syntax) kullanılabilir.
4.1.1
Parametresiz Metot Bildirimi
En basit fonksiyon bildirimi, parametresi olmayan fonksiyon bildirimleridir:
Liste 4.2.
2
d e f metot_adı
deyim ( l e r )
end
Parametresiz metot çağrılırken yalnızca adı yazılır:
metot_adı
4.1.2
Parametreli Fonksiyon Bildirimi
Parametreler yalın olabileceği gibi array gibi yapısal tipler de olabilir. Liste
4.3’deki metot x ile y argümanlarına bağlıdır. x ile y değişkenleri her veri
tipinden olabilir.
Liste 4.3.
2
d e f metot_adı ( x , y )
deyim ( l e r )
end
4.1. METOT SÖZDIZIMLERI
45
Parantezler kullanılmayabilir Metodun parametreleri () içine konulmayabilir Liste 4.3’deki metodu Liste 4.4 gibi de yazabiliriz. Parametreler
rasına virgül (,) konulur.
Liste 4.4.
2
d e f metot_adı
deyim ( l e r )
end
x, y
Parametreli metot çağrılırken, parametrelere gerçek değerler atanır. Metot
bildirimindeki değişkenlere parametre demiştik. Metot çağrısında parametrelere atanan değerlere gerçek parametre değeri denilir. Gerçek parametre
değerleri, bir literal (sabit) olabileceği gibi, değeri programda bulunabilen
bir ifade ya da fonksiyon olabilir.
4.1.3
Parametrelere Öntanımlı Değer Atama
Metot parametrelerine bildirimde öntanımlı (default) değerler atanabilir.
Metot çağrılırken parametresiz çağrı yapılırsa, öntanımlı değerler işlevsel
olur. Ama, istenirse, çağrıda başka parametre değerleri kullanılabilir.
Liste 4.5.
2
d e f metot_adı ( x = d e ğ e r 1 , y = d e ğ e r 2 )
deyim ( l e r )
end
Program 4.1’deki bildirimde argümanlara öntanımlı değerler atanmıştır. Metot çağrılırken parametre kullanılmazsa; yani parametresiz çağrı
yapılırsa, öntanımlı değerler işler. Ama çağrıda öntanımlı değelerden farklı
parametre değerleri kullanılırsa, öntanımlı değerler işlevsiz kalır, yeni değerler işler.
Program 4.1.
#! / u s r / b i n / ruby
2
d e f d i l l e r ( x=" Ruby " , y=" Python " )
p u t s " #{x} programlama d i l i n i öğreniy orum . "
p u t s " #{y} programlama d i l i n i öğreniy orum . "
end
7
diller
d i l l e r " Java " , "C++"
46
5
BÖLÜM 4. METOTLAR
/∗ ∗
Ruby programlama d i l i n i öğreniy orum .
Python programlama d i l i n i öğreniy orum .
Java programlama d i l i n i öğreniy orum .
C++ programlama d i l i n i öğreniy orum .
∗/
4.1.4
Return Değeri
Her Ruby metodu, öntanımlı olarak son satırındaki değeri return değeri
olarak verir. Örneğin
Liste 4.6.
4
def test
i = 10
j = 20
k = 30
end
print test
metodunun öntanımlı değeri son satırındaki 30 değeridir. Ruby metodunun
birden çok return değeri vermesi isteniyorsa, son satıra
Liste 4.7.
r e t u r n [ deyim [ ’ , ’ deyim ( l e r ) . . . ] ]
yazılır.
Liste 4.8.
4
2
def test
i = 100
j = 200
k = 300
return i , j , k
end
var = t e s t
puts var
/∗ ∗
100
200
300
∗/
4.1. METOT SÖZDIZIMLERI
4.1.5
47
Değişken Sayıda Parametre
Genel olarak, fonksiyon çağrılırken parametrelerin hepsine gerçek değerler verilir. Değerlerin yazılış sırası, parametrelerin yazılış sırasıdır. Ancak,
Ruby, değişken sayıda parametre kullanılmasına izin verir. Bunun için, metot bildiriminde parametrenin önüne joker (*) konulur:
Program 4.2.
5
1
6
11
def test
d e f sample ( ∗ t e s t )
p u t s " Parametre s a y ı s ı : #{ t e s t . l e n g t h } "
fo r i in 0 . . . test . length
p u t s " P a r a m e t r e l e r : #{ t e s t [ i ] } "
end
end
sample " Manisa " , " 7 " , "G"
sample "IBM" , " 64 " , "V" , "MIT"
/∗ ∗
Parametre s a y ı s ı : 3
Parametreler :
Manisa
Parametreler : 7
Parametreler : G
Parametre s a y ı s ı : 4
P a r a m e t r e l e r : IBM
Parametreler :
64
Parametreler : V
P a r a m e t r e l e r : MIT
∗/
Program 4.3.
# Array o l a r a k v e r i l e n s a y ı l a r ı n o r t a l a m a s ı n ı b u l u r
4
9
d e f ortalama_bul ( a r r a y )
sum = 0 . 0
sonuç = 0 . 0
i f array . length > 0 then
a r r a y . each do | s a y ı |
sum += s a y ı
end
sonuç = sum / a r r a y . l e n g t h
end
r e t u r n sonuç
end
14
veri = [5.5 , 8.7 , 2.6 , 3.9]
o r t a l a m a = ortalama_bul ( v e r i )
p u t s " Ortalama #{o r t a l a m a } "
3
/∗ ∗
Ortalama 5 . 1 7 5
∗/
48
4.1.6
BÖLÜM 4. METOTLAR
Çoklu Çıktıyı Array Olarak Elde Etme
Program 4.4.
2
7
def f i y a t _ a r t ı r ( info , percentage )
sonuç = [ ] # Boş a r r a y y a r a t
i n f o . each_index do | i |
sonuç [ i ] = i n f o [ i ] ∗ ( 1 + ( p e r c e n t a g e / 1 0 0 . 0 ) )
end
r e t u r n sonuç
end
price = [67.00 , 43.00 , 78.00]
new_price = [ ]
12
2
new_price = f i y a t _ a r t ı r ( p r i c e , 1 0 . 0 )
p u t s new_price . j o i n ( " , " )
/∗ ∗
73.7 , 47.300000000000004 , 85.80000000000001
∗/
4.2
Sınıf Metotları
Sınıf metotları (class methods) doğrudan sınıftan çağrılabilen metotlardır.
Java’daki static metotlar gibidir. Metot adının önüne ait olduğu sınıf_ adı
ya da self anahtar sözcüğü yazılarak tanımlanabilirler. Araya (.) bağlacı
konulur. Program 4.5 ile Program 4.6 aynı işi yaparak deneme adlı sınıf
metodunu tanımlarlar.
Program 4.5.
2
c l a s s Test
d e f Test . deneme
" Adım deneme . Ben b i r
end
end
s ı n ı f metoduyum . "
Program 4.6.
5
c l a s s Test
d e f s e l f . deneme
" Adım deneme . Ben b i r
end
end
s ı n ı f metoduyum . "
Program 4.7’de sınıf metodu doğrudan Test sınıfından çağrılınca çalışıyor, ama anlık metot çalışmıyor (11. ve 12.satır). Tersine olarak, nesne
içinden çağrılan metot2 çalışıyor ama metot1 çalışmıyor.
4.2. SINIF METOTLARI
49
Program 4.7.
c l a s s Test
d e f s e l f . metot1
p u t s ’ c l a s s metodu ’
end
5
d e f metot2
p u t s ’ a n l ı k metot ’
end
end
10
Test . metot1
Test . metot2
15
# => " s ı n ı f metodu "
# => NoMethodError : u n d e f i n e d method . . .
Test . new . metot1
Test . new . metot2
# => a n l ı k metot
# => NoMethodError : u n d e f i n e d method . . .
Ruby çok uysal bir dildir. Örneğin, Program 4.8 sınıf metodunu üç
ayrı sözdizimi ile veriyor. Her üçü de çalışıyor. Programcı, kendisine uygun
olanı kullanabilir.
Program 4.8.
5
# Yl 1
c l a s s Test
d e f s e l f . smetot
p u t s ’ s ı n ı f metodu ’
end
end
Test . smetot # " c l a s s method "
10
15
#Yol 2
c l a s s Test
c l a s s << s e l f
d e f smetot
p u t s ’ s ı n ı f metodu ’
end
end
end
Test . smetot # " s ı n ı f metodu "
20
25
# Yol 3 :
c l a s s Test ; end
d e f Test . smetot
p u t s ’ s ı n ı f metodu ’
end
Test . smetot # " s ı n ı f metodu "
3
/∗
s ı n ı f metodu
s ı n ı f metodu
s ı n ı f metodu
∗/
50
BÖLÜM 4. METOTLAR
4.3
Anlık Metotlar
Anlık (instance) metotlar anlık değişkenler gibi, ancak sınıftan üretilen
nesne içinde işlevseldir. Program 4.9’de ses_ver metotlarından ilki self öntakısını aldığı için sınıf metodudur. Onu doğrudan Hayvan sınıfından çağırabiliriz. Ama ikinci ses_ver metodu anlık (instance) olduğu için, onu
ancak Hayvan sınıfından türetilen kedi nesnesi içinden çağırabiliriz. Adları aynı olmakla birlikte, bu iki metodun aduzayları farlıdır. O nedenle
çakışmazlar.
Program 4.9.
c l a s s Hayvan
def s e l f . ses_ver
#C l a s s metodu
p u t s "Möö ! möööö ! "
end
5
def ses_ver
# a n l ı k ( i n s t a n c e ) metodu
p u t s " miyaaav ! m i i i y a a v "
end
10
end
k e d i = Hayvan . new ( )
kedi . ses_ver
# a n l ı k ( i n s t a n c e ) metot ç a ğ r ı l ı y o r
15
Hayvan : : s e s _ v e r
# c l a s s metodu ç a ğ r ı l ı y o r
/∗
miyaaav ! m i i i y a v
Möö ! möööö !
4
∗/
Program 4.10.
1
6
c l a s s String
# metnin t e r s okunuşu a s l ı n a e ş i t s e p a l i n d r o m e ’ dur .
d e f palindrome ?
s e l f == s e l f . r e v e r s e
end
end
" l e v e l " . palindrome ?
/∗
true
2
∗/
Download

Metotlar