![]() Önceki |
![]() İçindekiler |
![]() Sonraki |
| Ruby Kullanıcı Kılavuzu | Kontrol Yapıları |
Bu bölümde Ruby'nin kontrol yapılarını açıklayacağız.
casecase deyimini bir dizi koşulşu test etmek için kullanırız. Bu yapı, C ve Java 'daki switch'e çok benzer ancak birazdan da göreceğiniz gibi ondan biraz daha güçlüdür.
ruby> i=8
ruby> case i
| when 1, 2..5
| print "1..5\n"
| when 6..10
| print "6..10\n"
| end
6..10
nil |
2..5, 2 ile 5 arasındaki sayı aralığını ifade eder. Sonraki ifade, i değişkeninin bu aralığa düşüp düşmediğini test eder:
(2..5) === i |
case aynı anda birden çok koşulu test etmek için === ilişki operaötürünü kullanır. Ruby'nin nesneye yönelik yapısını korumak için === operatörü nesneye uygun olarak yorumlanır. Örneğin aşağıdaki kodda ilk when'de dizgilerin eşitliği sınanırken ikinci when'de düzenli ifadenin eşliği sınanıyor.
ruby> case 'abcdef'
| when 'aaa', 'bbb'
| print "aaa or bbb\n"
| when /def/
| print "includes /def/\n"
| end
includes /def/
nil |
whileRuby döngü oluşturmak için bir çok yola sahiptir, bununla birlikte ilerki bölümde kesin döngüler kurmanıza yarayan tekrarlayıcıları göreceksiniz.
while bir tekrarlanmış if'ten başka birşey değildir. while'ı daha önce kelime-tahmin oyunumuzda ve düzenli ifadeler programımızda kullanmıştık ( önceki bölüme göz atın); while, koşul ... end tarafından çevrilmiş bir kod bloğu koşul doğru olduğu sürece tekrarlanmaktaydı. Ancak while ve if ayrı ifadeler olarak da kullanılabilir:
ruby> i = 0
0
ruby> print "Sifir.\n" if i==0
Sifir.
nil
ruby> print "Negatif.\n" if i<0
nil
ruby> print "#{i+=1}\n" while i<3
1
2
3
nil |
Bazen bir test koşulunu olumsuzlandırmak istersiniz. unless bir olumsuzlandırılmış if, until ise olumsuzlandırılmış bir while'dır. Bunları deneyip tecrübe etmeyi size bırakıyoruz.
Bir döngüyü içerden kesmek için dört yol vardır. İlki C'deki gibi, döngüden tamamen çıkmamızı sağlayan break'tir. İkincisi (C'deki continue'ya benzeyen) döngünün başına atlayan next'tir. Üçüncüsü o anki tekrarlayıcıyı yeniden çalıştıran redo'dur. Aşağıda break, next ve redo arasındaki farkı açıklayan bir C kodu bulunuyor:
while (condition) {
label_redo:
goto label_next; /* ruby'nin "next"'i */
goto label_break; /* ruby'nin "break"'i */
goto label_redo; /* ruby'nin "redo"'su */
...
...
label_next:
}
label_break:
... |
Bir döngünün içinden çıkmak için dördüncü yol, return'dür. return sadece döngüden değil, döngüyü içeren metottan da çıkmamızı sağlar. Eğer bir argüman verildiyse, metot çağrısına dönecektir; aksi halde nil döndürecektir.
forC programcıları for döngüsünün nasıl yapıldığını merak edeceklerdir. Ruby'nin for'u tahmin ettiğinizden biraz daha ilginçtir. Aşağıdaki döngü, her eleman için bir kere döner:
for elt in collection ... end |
Elemanlar bir değer aralığı olabilir (bu döngü denildiğinde çoğu insanın anladığı şeydir):
ruby> for num in (4..6)
| print num,"\n"
| end
4
5
6
4..6 |
Elemanlar dizi gibi başka bir türden değerler olabilir:
ruby> for elt in [100,-9.6,"pickle"]
| print "#{elt}\t(#{elt.type})\n"
| end
100 (Fixnum)
-9.6 (Float)
pickle (String)
[100, -9.6, "pickle"] |
Ancak ilerleme kaydediyoruz. for aslında each'i kullanmanın başka bir yoludur. Aşağıdaki iki form da aynı görevi görür:
# Eğer C ya da Java kullandıysanız bunun gibi birşeyi tercih edeeceksiniz:
for i in collection
...
end
# Bir Smalltalk programcısı aşağıdakini tercih ederler:
collection.each {|i|
...
} |
Tekrarlayıcılar sık sık konvansiyonel döngülere tercih edilir; bir kere onları kullanmaya alıştığınızda ne kadar kolay olduklarını göreceksiniz.
![]() Önceki |
![]() İçindekiler |
![]() Sonraki |