Yordam Nesneleri

Beklenmeyen durumlara cevap verebilme genelde istenen bir durumdur. Eğer diğer yöntemlere kod bloklarını argüman olarak geçebilirsek yani koda bir veriymiş gibi davranabilirsek bu işi oldukça kolaylaştırmış oluruz.

Yeni bir yordam nesnesi, proc kullanılarak oluşturulur:

ruby>   quguk = proc {
    |    print "GUGUKGUGUKGUGUK!!!\n"
    |  }
   #<Proc:0x4017357c>

Artık guguk bir nesne belirtiyor ve onun da diğer nesneler gibi istenebilir davranışları vardır. call yöntemi sayesinde bu davranışları talep edebiliriz:

ruby>   guguk.call
GUGUKGUGUKGUGUK!!!
   nil

Peki tüm bunlardan sonra, guguk bir yöntem argümanı gibi kullanılabilir mi? Tabii ki.

ruby>   def run( p )
    |    print "Bir yordamı çağırıyoruz...\n"
    |    p.call
    |    print "Bitti.\n"
    |  end
   nil
ruby>   run quux
Bir yordamı çağırıyoruz...
GUGUKGUGUKGUGUK!!!
Bitti.
   nil

trap yöntemi aldığımız cevabı tercihimize göre istediğimiz sistem sinyaline atamamıza izin verir.

ruby>   inthandler = proc{ print "^C basıldı.\n" }
   #<Proc:0x401730a4>
ruby>   trap "SIGINT", inthandler
   #<Proc:0x401735e0>

Normalde ^C'ye basmak yorumlayıcıdan çıkmamızı sağlar. Ancak şimdi bir ileti yazıldı ve yorumlayıcı hala çalışmaya devam ediyor, böylece yaptığınız işi kaybetmemiş oluyorsunuz. (Yorumlayıcıda sonsuza dek kapana kısılmadınız, hala exit yazarak ya da ^D'ye basarak çıkabilirsiniz.)

Başka konulara geçmeden önce son bir not: bir yordamı bir sinyale bağlamadan önce ona illa ki isim vermek gerekli değildir. Anonim bir yordam nesnesi aşağıdaki gibi olabilir:

ruby>   trap "SIGINT", proc{ print "^C basıldı.\n" }
   nil

daha kısa şekilde,

ruby>   trap "SIGINT", 'print "^C basıldı.\n"'
   nil

Bu kısaltılmış biçim, küçük anonim yordamlar yazdığınızda okunabilirlik sağlar.