18. Yordam Nesneleri

Beklenmeyen durumlara cevap verebilme genelde istenen bir durumdur. Eğer diğer yöntemlere kod bloklarını bağımsız değişken 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>guguk = proc {
    |    print "GUGUKGUGUKGUGUK!!!\n"
    | }
   #<Proc:0x000055e097ea42c8 <main>:0>

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 yöntem bağımsız değişkeni gibi kullanılabilir mi? Tabii ki.

ruby> def run( p )
    |    print "Bir yordamı çağırıyoruz...\n"
    |    p.call
    |    print "Bitti.\n"
    | end
   run
ruby> run guguk
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> kesmeişleyici = proc { print "^C basıldı.\n" }
    #<Proc:0x000055e097eab208 <main>0>
ruby> trap "SIGINT", kesmeişleyici
    "DEFAULT"

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 bilgi: 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" }
    #<Proc:0x000055e097eab208 <main>0>

daha kısa şekilde,

ruby>ntrap "SIGINT", 'print "^C basıldı.\n"'
    #<Proc:0x000055e097eaa678 <main>0>

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