عبارات لامبدا ( Lambda expressions )

عبارات لامبدا در اصل توابع یک خطی هستند که در برخی از زبان‌ها به عنوان توابع بی نام شناخته می‌شوند. گاهی اوقات اتفاق می افتد که در برنامه نمی‌خواهید یک تابع را جهت انجام یک کار تعریف کنید. در این صورت می‌توان از عبارات لامبدا استفاده کرد. نحوه استفاده از لامبدا به صورت زیر است :

nameOfLambda = lambda  { |parameter| expression }

یا

nameOfLambda = -> (parameter) { expression }

nameOfLambda نامی است که برای عبارت لامبدا در نظر می‌گیریم و در برنامه از همین نام برای اجرای کدهای آن استفاده می‌کنیم. حال یک مثال ساده از عبارت لامبدا را به دو روش فوق پیاده سازی می‌کنیم:

showMessage = lambda { |message| print(message) }

showMessage.call("Hello World!")
Hello World!

در کد بالا ما یک عبارت لامبدا به نام showMessage تعریف کرده‌ایم که یک پارامتر به نام message دارد. برای اجرای کدهای یک عبارت لامبدا، باید نام آن را نوشته، علامت نقطه بگذارید و سپس متد call را فراخوانی کنید. اگر عبارت لامبدا، پارامتر قبول کند باید آرگومان‌هایی که قرار است به آن ارسال شوند را در داخل پرانتزهای متد call بنویسید. در مثال بالا عبارت لامبدا یک پارامتر به نام message دارد. در نتیجه ما از طریق متد call یک آرگومان به آن ارسال کرده‌ایم. کد بالا را به صورت زیر هم می‌توان نوشت:

showMessage = -> (message) { print(message) }

showMessage.call("Hello World!")

لامبدا می‌تواند، هیچ پارامتری نگیرد:

showMessage = lambda { print("Hello World!") }

showMessage.call
Hello World!

هنگام فراخوانی متد باید تعداد آرگومان‌ها با تعداد پارامترها برابر باشد. مثلاً برنامه زیر با خطا مواجه می‌شود:

showMessage = lambda { |message1, message2| puts(message1, message2) }

showMessage.call("Hello World!")

در مثال بالا، عبارت لامبدا دو پارامتر قبول می‌کنید (|message1, message2|) ولی ما در داخل متد call یک آرگومان به آن ارسال کرده‌ایم. عبارات لامبدا نمی‌توانند دارای کلمه return باشند. می‌توان گفت که دستورات لامبدا در حالت عادی برگردانده می‌شوند و نیازی به این کلمه نیست:

getSquare = lambda { |number| number * number }

print(getSquare.call(5))
25