İçeriğe geç

Ruby’de Proc ile Lambda Farkı

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:

Ve bu da Lambda:

Şimdi ise sırayla bu işlevleri kullanalım:


Peki ne olacak? İkisinde de “Merhaba!” yazısını mı göreceğiz? Hayır:


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:


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:

Bu sebepten dolayı Proc ve lambda farklı sonuçlar üretebiliyor. İsteyenler için şöyle bir diyagramla da olayı basitleştirmek mümkün:

proc-lambda

Tarih:Genel