دالة Lambda في الكوتلن

م. خديجة باحويرثمنذ 4 سنوات

السلام عليكم و رحمة الله و بركاته

تعلمنا في الدروس السابقة عن الدوال أن الدوال لابد أن يكون لها اسم أي تعريف للدالة و ذلك أيضا في أغلب لغات البرمجة, و يكون تعريف الدالة كالتالي, fun متبوعة باسم الدالة و الأقواس و من ثم جسم الدالة function body {}:

fun swim()
{
//swim
}

في هذه المقالة معلومات أساسية عن دوال الـ lambda في الكوتلن... 

الكوتلن تدعم الـ lambda function و تسمى في بعض لغات البرمجة anonymous function 

في البداية ما هي الـ Lambda function ؟؟

ابسط تعريف وجدته لها هو (is an expression that makes function) فبدلا من تعريف دالة لها اسم , سنقوم بتعريف دالة ليس لها اسم 

أبسط مثال لها:

{ println("I like swimming!!") }

 لابد في ال lambda:

* أن تكون محاطة بالأقواس { }

* ليس لها تعريف أو اسم كما هو واضح من المثال السابق.

 

هي دوال يمكن التعامل معها كقيم values, اذن ماذا ممكن أن نعمل بها:

* يمكن اسنادها إلى متغيرات : 

val swim = {println("I like swimming !")}

val swim:()-> Unit = {println("I like swimming !")}

نلاحظ في المثال السابق تم كتابة نوع المتغير في السطر الثاني  و هذا اختياري للمبرمج!!

ثم نستطيع مناداة الـ swim كدالة كالتالي: (لا تنسى الأقواس بعد اسم المتغير!!)

swim()

//output
I like swimming!

 

 * يمكن في دوال الـ  lambda أن تستقبل argument  أي مدخلات, و تعود بقيمة أيضا نعرفها كالتالي: 

{ num : Int -> num * num}

حيث يسار السهم الـ lambda argument

و يمين السهم lambda body

و السهم يسمى function arrow

المثال التالي تم إنشاء دالة lambda تستقبل عدد و تعود بمربع هذا العدد, ثم تم اسناد دالة lambda إلى المتغير square:

val square = { num : Int -> num * num}

و نستطيع اختياريا أن نضع نوع المتغير:

val square : (Int) -> Int = { num : Int -> num * num}

في الشكل التالي شرح للدالة أكثر:

أخيرا نستطيع مناداتها كالتالي:

square(2)

//output is 4

*أيضا يمكن تمرير Lambda function كـ argument أي مدخلات لدوال أخرى ...هذه الجزئية تحتاج كوب قهوة !! :) 

سأبدأ بشرحها خطوة بخطوة:

في المثال السابق أنشأنا lambda function تقوم بايجاد مربع أي عدد , و تم اسنادها إلى المتغير square

val square = {num : Int -> num * num}

لنرى الآن كيف يمكننا تمريرها كمدخلات لدوال أخرى, لنفرض أن لدينا named function عادية تستقبل مدخلين و تعود بالقيمة Int أيضا:

المدخل الأول من النوع Int

والمدخل الثاني من النوع lambda function و التي تستقبل Int  و تعود بـ Int :

fun findSquare (number: Int, operation: (Int) -> Int ): Int
{

//function body

}

الآن داخل الـ Function Body 

فقط سننادي الـ lambda function التي تم تمريرها كمدخل , و القيمة العائدة منها نجعلها كـ return value

fun findSquare (number: Int, operation: (Int) -> Int ):Int
{
   return operation(number)
}

ملاحظة: من الممارسات الجيدة أن تضع المدخلات من النوع lambda في الاخير بالنسبة للبارمترات أو المدخلات

الآن بقي شي أخير كيف يمكن مناداة الدالة findSquare كالتالي:

findSquare(6, square)

بحيث مررنا لها المدخل الأول من النوع Int  مررت الرقم ٦, و الثاني من النوع Lambda و مررت لها اسمها و هو square

أخيرا أن الـ squareFunction تعود بقيمة من النوع Int, إذن لابد أن نضعها داخل printLn أو نسندها إلى متغير كالتالي:

val result = findSquare(6, square) 
println(result).  //output 36

 البرنامج كامل :) :

val square = {num:Int -> num * num}          //Lambda function

fun findSquare(number:Int, operation: (Int)-> Int): Int 
  return operation(number)
}

fun main()
{
  println(findSquare(6,square))
}

 

أرجو أن يكون هذا الدرس حقق لك فهم الـ Lambda function 

أرجو ترك تعليقك أسفل الدرس و امساعدة في نشر الدرس إذا وجدته مفيد لغيرك.

 

شكرا لوقتك :)

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !