function references

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

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

في الدرس السابق تكلمت عن دوال الـ lambda و كيف يمكننا تمريرها كمدخلات لدوال أخرى, كما يمكن تخزينها و اسنادها إلى متغيرات.

المثال الذي تم استخدامه في الدرس السابق:

val square = {num:Int -> num * num}.   //lambda

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

println(findSquare(6,square))

سنرى في هذا الدرس كيف يمكننا تطبيق نفس المفهوم على الدوال العادية التي تحتوي على اسم (named functions)

من أحد مميزات لغة الكوتلن هو:

إمكانية اسناد الدوال إلى متغيرات  Literal Function , و أيضا استخدامها كمدخلات لدوال أخرى كما هو الحال مع الـ lambda , و هذه الميزة للدوال تسمى Kotlin support functions as a type.

في هذا الدرس سنتعلم..

* كيفية اسناد الدوال إلى متغيرات

* كيفية تمريرها كمدخلات arguments لدوال أخرى

** إسناد الدوال العادية إلى متغيرات :

ننشيء دالة عادية,  تستقبل عددين (Int, Int) و تعود بالمجموع لهما Int :

fun sum(x: Int, y: Int) : Int = x + y

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

val add: (Int, Int) : Int = ::sum

فقط قبل اسم الدالة نكتب:

Function Reference و هي عبارة عن نقطتين رأسية مكررة مرتين قبل اسم الدالة المراد اسنادها إلى متغير.

 

** تمرير الدوال العادية كمدخلات لدوال أخرى:

أولا ننشيء دالة عادية بدلا من lambda, تستقبل عددين و تعود بالمجموع لهما.

fun sum(x: Int, y: Int) : Int = x + y

ثم ننشي دالة بسيطة, تستقبل ٣ مدخلات بالترتيب:

المدخل الأول: Int

المدخل الثاني: Int 

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


fun findSum(number1: Int, number2: Int, operation: (Int, Int)-> Int): Int
{
    return operation(number1, number2)
}

الآن كيف سيتم تمرير الدالة sum  كمدخل إلى الدالة findSum, لو طبقنا نفس طريقة الـ lambda فاننا سنكتب:

findSum(5, 6, sum) //WRONG

السطر السابق يحتوي على خطأ بحيث أننا مررنا الدالة sum بنفس طريقة تمرير الـ lambda و هنا خطأ, لأن الـ sum ليست lambda

مالحل؟ كيف يمكنني تمرير دالة عادية إلى دالة اخرى كمدخل ؟؟

الاجابة هي :

استخدام : Function Reference :

و هي عبارة عن نقطتين رأسية مكررة مرتين في كل مرة نقوم فيها بتمرير اسم الدالة على أنها مدخل (argument)

و بالتالي يصبح مناداة الدالة findSum و تمرير الدالة sum لها بشكل صحيح كالتالي:

println( findSum(5, 6, ::sum) )

//output
11

 

اذا كانت أول مرة تتعلم فيها الFunction reference قد يكون الأمر غريبا نوعا ما, لكن مع الوقت ستعتاد على الأمر.

لازال هناك الكثير من الاستخدامات العملية لها ستظهر في الدروس القادمة.

تعلمنا في هذا الدرس بشكل بسيط كيف يمكننا اسناد الدوال إلى متغيرات أو كيف يمكن تمريرها كمدخلات . الفرق بينها و بين الـ Lambda أننا نستخدم هنا الـ :: قبل اسم الدالة المراد اسنادها أو تمريرها ..

 

أرجو أن يكون هذا الدرس مفيد لك.

و السلام عليكم

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

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

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