Ruby/Kontrol Yapıları

Vikikitap, özgür kütüphane

Kontrol Yapıları[değiştir]

Koşullu Dallanmalar[değiştir]

Ruby program akışını koşullu dallanmalar kullanarak kontrol edebilir. Bir koşullu dallanma , bir karşılaştırmanın sonucunu alır ve sonucun doğru ya da yanlış olmasına göre bir blok program çalıştırır. Eğer karşılaştırma eşitliğinin sonucu false veya nil ise yanlış sonucun bloğu çalışır geri kalan tüm olasılıklar doğru sonuç olarak değerlendirilir. Yani sıfır değeri bile doğru olarak değerlendirilir. Diğer programlama dilllerinde sıfır yanlış sonuç olarak değerlendirilir.

Birçok programlama dilinde koşullu dallanmalar deyimlerdir ve hangi kodun işleneceğini karar verirler. Ama kendileri bir değer dönmezler. Ruby'de koşullu dallanmalar aynı zamanda işlemdirler. Diğer işlemler gibi değerleri işlerler. Örneğin if işlemi sadece koda karar vermez aynı zamanda bir değer döner. Mesela aşağıdaki if işlemi 3 değerini geri döner:

 if true
   3
 end

Ruby'nin koşullu dallanmaları aşağıda açıklanmıştır.

if işlemi[değiştir]

Örnekler:

 a = 5
 if a == 4
   a = 7
 end
 print a # if bloğu işletilmediği için 5 yazacaktır

Ayrıca eğer then kullanırsanız if işlemcisi ve kod bloğunu aynı satıra yazabilirsiniz:

 if a == 4 then a = 7 end
 #ya da 
 if a == 4: a = 7 end

Bu şu şekilde de ifade edilir:

 a = 5
 a = 7 if a == 4
 print a # if bloğu işletilmediği için 5 yazacaktır

unless işlemi[değiştir]

Unless işlemi if işleminin tersidir, eğer yapılan karşılaştırmanın sonucu yanlış ise kod bloğu işletilir.

Örnekler:

 a = 5
 unless a == 4
   a = 7
 end
 print a # unless bloğu işletildiği için 7 yazacaktır

unless işlemi hemen hemen tam anlamıyla if işleminin tersi olarak çalışır:

 if !işlem      # unless işlem ile aynı

Farkı, if işlemi elsif ile karşılaştırmanın yanlış çıkmasıyla ikinci bir karşılaştırma yapar ama unless işleminin elsunless gibi bir devamı yoktur.

Ayrıca aynı if işlemindeki gibi :

 a = 5
 a = 7 unless a == 4
 print a # unless bloğu işletildiği için 7 yazacaktır

Çalıştırılacak kod bloğu tek satır olduğunda tek satırlık şekil daha yakışıklı olacaktır.

if-elsif-else işlemi[değiştir]

elsif (dikkat edin elsif yazılır elseif değil) ve else blokları sayesinde birbiriyle alakalı birçok test yaparak programınızı daha etkili kontrol edebilirsiniz. elsif ve else blokları sadece if karşılaştırması yanlış ise işlenir. Birçok elsif bloğu olabilir ama sadece bir if ve bir else olabilir.

Yazım:

 if işlem
   ...kod bloğu...
 elsif başka işlem
   ...kod bloğu...
 elsif başka işlem
   ...kod bloğu...
 else
   ...kod bloğu...
 end

kısa-if işlemi[değiştir]

"kısa-if" işlemi bir karşılaştırma sonucunda değerler dönmek için kestirme yoldur. String birleştirmelerinde koşullu işler yapmak için idealdir.

Örnek:

 a = 5
 plus_or_minus = '+'
 print "#{a}#{plus_or_minus}1 işlemi sonucu: " + (plus_or_minus == '+' ? (a+1).to_s : (a-1).to_s) + "."

Bu [? (expr) : (expr)] şeklindeki yapıya aynı zamanda ternary (üçlü grup) işlem de denir. Bu sadece string düzenleme gibi basit işlerde kullanılır çünkü okuması biraz karışıktır.

 irb(main):037:0> true ? 't' : 'f'
 => "t"
 irb(main):038:0> false ? 't' : 'f'
 => "f"

case işlemi[değiştir]

Yukarıda açıklanan if-elsif-else işlemlerinin bir başka alternatifi olarak case işlemi kullanılır. Ruby'de case işlemi çoklu işlemi destekler. Örneğin bir sayı ile 5 arasındaki ilişkiyi tayin etmek istiyoruz :

 a = 1
 case 
   when a < 5 then puts "#{a}, 5 ten küçüktür"    
   when a == 5 then puts "#{a}, 5 e eşittir"   
   when a > 5 then puts "#{a}, 5 ten büyüktür" 
 end

Not olarak eşitliği test ederken == kullanılır. Atama yapmak için = kullanılır. Şu durumda Ruby atama yapacaktır:

   when a = 5 then puts "#{a}, 5 e eşittir"   # DİKKAT! Bu kod a değerini değiştirir!

Bu bizim istediğimiz değil! Biz burda karşılaştırma yapmak istiyoruz.

Bir diğer eşlenik deyim de "then" yerine ":" kullanmaktır:

 when a < 5 then puts "#{a}, 5 ten küçüktür"
 when a < 5 : puts "#{a}, 5 ten küçüktür"

Daha kestirme bir yol olarak case ile karşılaştırma yapılacak değişkeni baştan verebiliriz:

 case a
   when 0..4 then puts "#{a}, 5 ten küçüktür"    
   when 5 then puts "#{a}, 5 e eşittir" 
   when 5..10 then puts "#{a}, 5 ten büyüktür" 
   else puts "istenmeyen değer #{a} "         # a 10 dan büyük ya da negatif
 end

Note: Range'ler açıkça sabit olduğu için a'nın istenmeyen değerlerini sınırlamak için kullanılır. Bu kestirme yol olası değerler bilindiğinde çok faydalı olacaktır. Örneğin :

 a = "elma"
 puts case a
   when "vanilya" then "bir baharat"    
   when  "ıspanak" then "bir sebze" 
   when "elma"  then "bir meyve" 
   else "beklenmeyen değer"
 end

Bu satırları irb'de girerseniz :

 bir meyve
 =>nil

Case hakkında diğer bilgileri Linuxtopia Ruby Programming [1] adresinde bulabilirsiniz.

Döngüler[değiştir]

while[değiştir]

Ruby'de while ifadesi kullanım olarak if ve diğer dillerdeki while ifadesine benzer:

while < işlem >
  <...kod bloğu...>
end

Kod bloğu işlem sonucu true olduğu sürece tekrar tekrar işlenecektir.

Ayrıca aynı if ve unless ifadelerinde olduğu gibi, şöyle de mümkündür:

<...kod...> while < işlem >

Aşağıdaki ilginç kodu inceleyin...

 line = readline.chomp while line != "bunu arıyordum"

Bu satır çalıştırılınca konsoldan girilen satırları alır ve "bunu arıyordum" yazısı girilene kadar döngü bitmez.

until[değiştir]

until ifadesi işleyiş olarak while ifadesine benzer. while ifadesinin tersine until kullanılınca kod bloğu işlemin sonucu false olduğu sürece işlenir.

until < işlem >
  <...kod bloğu...>
end

Anahtar Kelime[değiştir]

return[değiştir]

return değer satırı içinde bulunduğu metodun değer ile geri dönmesini sağlar.