English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا المقال، ستتعرف على الدوال. ما هي الدالة، بنيتها، وكيفية إنشاء دالة مستخدمة في Kotlin.
في البرمجة، هي مجموعة من الجمل التي تنفذ مهمة معينة.
تستخدم الوظائف لتحويل برامج كبيرة إلى قطع modular. على سبيل المثال، قد تحتاج إلى إنشاء دائرة وتلوينها بناءً على إدخال المستخدم. يمكنك إنشاء وظيفتين لحل هذه المشكلة:
وظيفة createCircle() - تستخدم لإنشاء الدائرة
وظيفة colorCircle() - تستخدم لتلوين الدائرة
تقسيم برنامج معقد إلى مكونات أصغر يجعل برنامجنا أكثر تنظيماً وسهولة في التعامل.
إضافةً إلى ذلك، يمنع التكرار ويجعل الكود قابلاً للإعادة الاستخدام.
هناك نوعان من الوظائف بناءً على ما إذا كانت الوظيفة مخصصة أو من مكتبة معيارية:
وظائف مكتبة Kotlin
الوظائف المخصصة
الوظائف المعيارية هي الوظائف المدمجة في Kotlin التي يمكن استخدامها في أي وقت. على سبيل المثال،
print() هو وظيفة مكتبة، يمكن استخدامها لطباعة الرسائل إلى流出 المعياري (المراقب).
يعود sqrt() قيمة الجذر التربيعي للرقم (قيمة Double).
fun main(args: Array<String>) { var number = 5.5 print("Result = ${Math.sqrt(number)}") }
عند تشغيل هذا البرنامج، الناتج يكون:
Result = 2.345207879911715
هذاالمكتبة القياسية Kotlin، للاستعراض.
كما ذكرنا سابقًا، يمكنك إنشاء وظائف بنفسك. هذه الوظائف تُسمى الوظائف المخصصة.
قبل استخدام (استدعاء) الوظيفة، يجب أولاً إعدادها.
طريقة إعداد وظيفة في Kotlin كالتالي:
fun callMe() { // جسم الوظيفة }
لإعداد وظيفة في Kotlin، استخدم كلمة المفتاح fun. ثم اسم الوظيفة (المعرف). هنا، اسم الوظيفة هو callMe.
في البرنامج المذكور أعلاه، تكون الأقواس فارغة. هذا يعني أن الوظيفة لا تقبل أي معلمات. ستعرف المزيد عن المعلمات في الجزء التالي من المقال.
الكود الموجود داخل الأقواس {} هو جسم الوظيفة.
يجب عليك تفعيل هذه الوظيفة لتشغيل الكود داخل الوظيفة. إليك كيفية القيام بذلك:
callme()
تُدعى هذه الجملة بوظيفة callMe() التي تم إعلانها مسبقًا.
fun callMe() { println("الطباعة من وظيفة callMe().") println("هذا رائع (ما زال يتم الطباعة من الداخل).") } fun main(args: Array<String>) { callMe() println("الطباعة الخارجية من وظيفة callMe().") }
عند تشغيل هذا البرنامج، الناتج يكون:
الطباعة من وظيفة callMe(). هذا رائع (ما زال يتم الطباعة من الداخل). الطباعة الخارجية من وظيفة callMe().
لا تقبل الوظيفة callMe() أي معلمات.
بالإضافة إلى ذلك، لا يعود أي قيمة من هذه الوظيفة (نوع العودة هو Unit).
دعونا نرى مثالاً آخر للدالة. تقبل الدالة معلمات وتعيد قيمة.
fun addNumbers(n1: Double, n2: Double): Int { val sum = n1 + n2 val sumInteger = sum.toInt() return sumInteger } fun main(args: Array<String>) { val number1 = 12.2 val number2 = 3.4 val result: Int result = addNumbers(number1, number2) println("result = $result") }
عند تشغيل هذا البرنامج، الناتج يكون:
result = 15
في هذا السياق، يتم تقديم معلمتين من نوع Double، number1 وnumber2، إلى دالة addNumbers() أثناء استدعاء الدالة. تُسمى هذه المعلمات المعلمات الفعلية (أو المعلمات الفعلية).
result = addNumbers(number1, number2)
المعلمات n1 وn2 تستقبل المعلمات المقدمة (في تعريف الدالة). تُسمى هذه المعلمات المعلمات النمطية (أو المعلمات النمطية).
في Kotlin، تُفصل المعلمات بفواصل البينات. يجب أن تكون أنواع المعلمات النمطية مكتوبة بشكل صريح.
لنلاحظ، يجب أن تتطابق أنواع المعلمات الفعلية وأنواع المعلمات النمطية، أي أن نوع المعلمات الفعلية الأولى يجب أن يتطابق مع نوع المعلمات النمطية الأولى. يجب أن يتطابق نوع المعلمات الفعلية الثانية مع نوع المعلمات النمطية الثانية، وهكذا.
في هذا السياق،
return sumInteger
هي جملة return. تؤدي هذه الكود إلى إنهاء دالة addNumbers()، والتحكم في البرنامج ينتقل إلى دالة main().
في البرنامج، يتم استخراج sumInteger من الدالة addNumbers(). تم تخصيص هذه القيمة للاسم result.
لنلاحظ،
sumInteger وresult كلاهما من نوع Int.
يحدد نوع العودة للدالة في تعريف الدالة.
//نوع العودة Int fun addNumbers(n1: Double, n2: Double): Int { ... .. ... }
إذا لم يعد الدالة أي قيمة، يكون نوع العودة Unit. إذا كان نوع العودة Int، يمكن تحديد نوع العودة في تعريف الدالة.
fun main(args: Array<String>) { println(getName("John", "Doe")) } fun getName(firstName: String, lastName: String): String = "$firstName $lastName"
عند تشغيل هذا البرنامج، الناتج يكون:
John Doe
في هذا السياق، تقبل الدالة getName() اثنين من المعلمات من نوع String وتعيد String.
إذا كان يعود الدالة إلى تعبير واحد (مثل المثال السابق)، يمكن التغاضي عن الأقواس الكاملة {} في جسم الدالة، وأيضاً تحديد الجسم بعد رمز =.
في هذه الحالة، يمكن أن يكون الإعلان الصريح عن نوع العودة اختياريًا، لأن نوع العودة يمكن أن يتم استنتاجه من قبل الماكينات. في المثال أعلاه، يمكنك استبدال
fun getName(firstName: String, lastName: String): String = "$firstName $lastName"
المثل:
fun getName(firstName: String, lastName: String) = "$firstName $lastName"