3. Basit Örnekler

İçindekiler
3.1. Girdi/Değerlendirme döngüsü

Şimdi faktöriyel hesabı yapan basit bir işlev yazalım. Faktöriyel'in matematiksel tanımı şöyledir:

    n! = 1                (n==0 ise)
       = n * (n-1)!       (aksi taktirde)

Ruby'de bunu aşağıdaki gibi yazabiliriz:

def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end

Tekrarlanan end deyiminin varlığını fark etmiş olmalısınız. Sırf bu yüzden Ruby "Algol benzeri" olarak anılır. (Aslında Ruby'nin sözdizimi Eiffel dilini daha çok andırmaktadır.) Ayrıca return deyiminin eksikliğini de hissetmiş olmalısınız. Bu deyim Ruby için gereksizdir çünkü bir Ruby işlevde değerlendirdiği en son şeyi döndürür. return deyimi kullanılabilir ancak gereksizdir.

Şimdi faktöriyel işlevimizi deneyelim. Ekleyeceğimiz satır, bize çalışan bir yazılım sunacaktır:

# Sayının faktöriyelini bulan yazılım
# fact.rb olarak kaydedin

def fact(n)
  if n == 0
    1
  else
    n * fact(n-1)
  end
end

print fact(ARGV[0].to_i), "\n"

Burada ARGV komut satırı girdilerini içeren bir dizidir ve to_i alınan bir dizgeyi tamsayıya çevirmeye yarar.

$ ruby fact.rb 1
1
$ ruby fact.rb 5
120

Acaba girdi olarak 40 versek çalışır mı? Muhtemelen hesap makineniz taşma hatası verecektir...

$ ruby fact.rb 40
815915283247897734345611269596115894272000000000

Bu çalışır, üstelik Ruby makinenizin belleğinin izin verdiği kadar büyük tamsayıyla da çalışabilir. 400 için aşağıdaki gibi bir çıktı alacaksınız:

$ ruby fact.rb 400
64034522846623895262347970319503005850702583026002959458684
44594280239716918683143627847864746326467629435057503585681
08482981628835174352289619886468029979373416541508381624264
61942352307046244325015114448670890662773914918117331955996
44070954967134529047702032243491121079759328079510154537266
72516278778900093497637657103263503315339653498683868313393
52024373788157786791506311858702618270169819740062983025308
59129834616227230455833952075961150530223608681043329725519
48526744322324386699484224042325998055516106359423769613992
31917134063858996537970147827206606320217379472010321356624
61380907794230459736069956759583609615871512991382228657857
95493616176544804532220078258184008484364155912294542753848
03558374518022675900061399560145595206127211192918105032491
00800000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000

Sonucun doğruluğunu sınayamayız ama öyle olması gerekiyor :).

3.1. Girdi/Değerlendirme döngüsü

Eğer Ruby'yi hiçbir girdi yazmadan çağırırsanız, komutları standart girdiden alır ve girdinin bitiminde komutları çalıştırır:

$ ruby
print "merhaba dunya\n"
print "hoscakal dunya\n"
^D
merhaba dunya
hoscakal dunya

Ruby, eval.rb adında bir araç ile gelir. Bu, ruby kodunuzu etkileşimli olarak klavyeden alan ve yazdıklarınızı gösteren bir araçtır. Bu öğreticinin devamında sıkça kullanacağız.

Eğer ANSI uyumlu bir uçbirimle çalışıyorsanız[73], ek olarak girintileme yapabilen, kodu renklendirebilen ve uyarılar veren gelişmiş eval.rb'yi kullanmalısınız. Aksi takdirde, ruby dağıtımının sample dizininde bulunan ve ANSI uyumluluğu gerektirmeyen sürümünü kullanabilirsiniz. Kısa bir eval.rb oturumu:

$ ruby eval.rb
ruby> puts "Merhaba dünya.\n"
Merhaba dünya.
   nil
ruby> exit

Merhaba dünya, puts ile çıktılandı. Sonraki satırdaki nil ise son değerlemenin sonucunu göstermektedir; ruby, deyimlerle ifadeler arasında bir ayrım yapmaz, yani kod parçalarının değerlendirilmesi temel olarak kodun icra edilmesidir. Burada nil, print'in anlamlı bir değer döndürmediğini ifade etmektedir. Son olarak, exit yazarak yorumlayıcı döngüsünü sonlandırıyoruz.

Bu kılavuzun devamında ruby> bir eval.rb oturumunun girdi istemi olarak kullanılmış olacaktır.



[73] Unix altında çalışıyorsanız zaten uçbirim ANSI uyumludur. Uçbirim artalan rengini siyah seçerseniz eval.rb renklendirmesi ile sorun yaşamazsınız. DOS altında bunu sağlamak için ANSI.SYS veya ANSI.COM yüklemelisiniz.