Ruby dilini öğrenirken çok fazla zorluk çekmedim. Tabi her dilde olduğu gibi bunda da başta beyin mıncıklayan, sonradan “Aaa, öyleymiş tabii” denilen kısımlar var. Şahsen ben Ruby’yi öğrenmek için Codecademy‘i kullandım. Bir çok programlama dilini ve meşhur API’leri öğrenebileceğiniz gayet güzel bir site.
Codeacademy’de güzel güzel Ruby’de ilerlerken, Proc ve Lambda kısımlarına geldim. Öncelikle bunlar nedir, ne değildir bir hatırlamak lazım. Proc ve Lambda, tam anlamıyla belli bir kod bloğunu işlev haline getiren araçlardır. Rahatça bunu bir işlev (fonksiyon) gibi düşünebilirsiniz. Yaptırmak istediğiniz işleri, bir bloğa yerleştirip kolayca onu her yerde, belli parametreleri de kullanarak halledebilirsiniz.
Ve meraklı insanın sorusu gelir: Eee? Madem aynı işi yapıyorlar, neden iki tane yöntem var? Cevabı basit: Tam olarak aynı işi aynı şekilde yapmıyorlar. Bunu bir örnekle gösterelim. Önce Proc:
1 2 3 4 5 | def proc_deneme ornek = Proc.new { return "Merhaba!" } ornek.call return "Hoşcakal!" end |
Ve bu da Lambda:
1 2 3 4 5 | def lambda_deneme ornek = lambda { return "Merhaba!" } ornek.call return "Hoşcakal!" end |
Şimdi ise sırayla bu işlevleri kullanalım:
1 2 | puts proc_deneme puts lambda_deneme |
Peki ne olacak? İkisinde de “Merhaba!” yazısını mı göreceğiz? Hayır:
1 2 3 4 | >> puts proc_deneme Merhaba! >> puts lambda_deneme Hoşcakal! |
Ama neden? Mantıken bir işlevin (fonksiyonun) herhangi bir yerinde return kullanırsak, işlev o noktadan itibaren kesintiye uğrayacaktır. Dolayısı ile burada “Hoşcakal!” yazısını görmemiz mümkün değil. Diye düşündüm ben de 🙂
Fark aslında Lambda’nın işleyişi ile alakalı. Yapısal olarak yukarıdaki Proc sistemleri, sanki kodu oraya normal bir şekilde kopyala-yapıştırla yerleştirmişiz gibi davranıyor. Dolayısı ile alttaki return’e ulaşamıyoruz. Üstteki örnek Proc kodunu şöyle de düşünebiliriz:
1 2 3 4 | def proc_deneme return "Merhaba!" return "Hoşcakal!" end |
Kod sanki böyleymiş gibi çalışıyor. Lambda ise kendi içindeki bloğu, tam anlamıyla bir işlev haline getiriyor. Ortaya bir return bloğu yerleştirmediği için, en alttaki nesne dönüyor. Yukarıdaki lambda kodunu şöyle de düşünebiliriz:
1 2 3 4 5 6 7 8 | def mesaj return "Merhaba!" end def lambda_deneme mesaj return "Hoşcakal!" end |
Bu sebepten dolayı Proc ve lambda farklı sonuçlar üretebiliyor. İsteyenler için şöyle bir diyagramla da olayı basitleştirmek mümkün: