high level function

الدالة من المستوى العالي وهذا يعني أن هذه الدالة لا تكتفي فقط بتمرير متغيرات فردية وانما أيضا تقوم بتمرير دالة ومن الممكن ان ترجع دالة .

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

  • تمرر لها دالة كوسيط .
  • تعيد دالة .
  • نستطيع فعل الخطوتين السابقتين أيضا معاً .

ويرتبط استخدام lambda  ارتباط وثيق بالدالة عالية المستوى فهس تعمل على ترتيب الجمل البرمجية وجعله اسهل كما لا يخفى علينا تقلل من الأسطر البرمجية مما يعطينا شكل بسيط ونظيف .

سنقوم بعرض مثال لتوضيح مفهوم الدالة عالية المستوى :

الخطوة الأولى :

 انشأنا دالة بسيطة تقوم بتمرير متغيرين :

– متغير من نوع عدد صحيح ونريد ان نطبع العدد الذي يسبقه والعدد التالي له .

– المتغير الثاني : دالة تقوم بطباعة العدد المدخل (مع العلم نستطيع أن ننشئ دالة لا علاقة لها بالمتغير السابق كأن تقوم بإنشاء دالة تلقي التحية مثلاً ).

fun calculat( num1:Int , printNumber:(Int)->Unit){

    var PreviousNumber = num1 - 1
    var NextNumber = num1 + 1
    printNumber(num1)
    println("the previous number is : $PreviousNumber and the next number is : $NextNumber")

}

لنركز قليلا بالدالة الممررة وهي : printNumber:(Int)->Unit وهذا يعني أننا عندما نمررها فقط نكتفي بكتابة نوع البيان المدخل وهو كما  هو موضح لدينا من نوع عدد صحيح ومن ثم السهم الذي هو أساسي ومن ثم نوع الخرج أو البيان العائد لنا وهو في المثال لا يعود بقيمة 

الخطوة الثانية  :

سننشئ دالة مضمنة بداخل متغير :

val myNumber : (Int)->Unit = {number -> println(number)}

حسناً سنتحدث عن هذا الأن قليلاً ، هذه هيا الصيغة التي تعلمنها كما سبق لنا ولكن نريد أن نوضح أن أهميتها تكمن في أننا كما سنرى في الخطوة الثالثة بعد قليل أنها توفر علينا الوقت بدل من أن ننشئ دالة جديدة أخرى عند الاستدعاء وسوف نرى ذلك .

 الخطوة الثالثة  :

الاستدعاء وهي الخطوة النهائية :

fun main (args:Array<String>){
    println("please enter any number :")
    var number1 : Int = readLine()!!.toInt()
    calculat(number1, myNumber)
}