0Pricing
Kotlin Academy · درس

دوال inline: إزالة الحمل الزائد لـ Lambda

ضع علامة inline على الدوال لتجنّب إنشاء كائنات لمعاملات lambda.

دوال inline: إزالة الحمل الزائد لـ Lambda درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ما الدالة inline؟

عادةً، تُجمَّع لامبدا الممرَّرة إلى دالة في فئة مجهولة. ويؤدي كل استدعاء إلى تخصيص كائن جديد، مما يستهلك الذاكرة والوقت. تخبر الكلمة المفتاحية inline المترجم بأن ينسخ جسم الدالة (ومعاملات لامبدا الخاصة بها) مباشرةً إلى موضع الاستدعاء.

تعريف inline

أضف المُعدِّل inline قبل fun:

inline fun measureTime(block: () -> Unit): Long {
    val start = System.nanoTime()
    block()
    return System.nanoTime() - start
}

كيفية إعادة كتابة المترجم للاستدعاء

يتحوّل استدعاء مثل measureTime { doWork() }، على مستوى bytecode، إلى لصق جسم measureTime داخل موضع الاستدعاء — فلا يُخصَّص أي كائن لامبدا على الإطلاق.

متى تستخدم inline

استخدم inline عندما:

  • تأخذ الدالة معامل لامبدا واحدًا أو أكثر
  • يُستدعى منها كثيرًا في المسارات الساخنة (الحلقات المحكمة و composables)
  • تحتاج إلى معاملات أنواع reified (سيأتي شرحها لاحقًا)

مثال على اختبار الأداء

من دون inline، يخصص كل استدعاء لدالة من الدرجة الأعلى كائن لامبدا. ومعه، يرى JVM تعليمات متسلسلة مباشرة — من دون تخصيص أو استدعاء افتراضي.

inline fun repeat(n: Int, block: () -> Unit) {
    for (i in 0 until n) block()
}

عمليات الإرجاع غير المحلية

من أهم فوائد الدوال inline أن بإمكان لامبدا استخدام return للخروج من الدالة المحيطة، وليس من لامبدا فقط. ويُسمى ذلك إرجاعًا غير محلي.

inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
    for (item in list) block(item)
}

fun findFirst(list: List<Int>): Int {
    forEach(list) { if (it > 5) return it }  // returns from findFirst
    return -1
}

قيود inline

لا يمكن تخزين الدوال inline في المتغيرات أو تمريرها ككائنات، لأنها لا توجد ككيانات من الدرجة الأولى أثناء التشغيل. ولا يمكنك استدعاء f(::measureTime) عندما تتوقع f مرجع دالة بهذا التوقيع.

تضمين مسارات معالجة المجموعات

دوال المكتبة القياسية مثل map وfilter وforEach وغيرها كلها inline. ولهذا لا يؤدي تسلسلها إلى إنشاء كائنات closure إضافية لكل عنصر.

val result = (1..1_000_000)
    .filter { it % 2 == 0 }   // inline
    .map { it * it }           // inline
    .take(10)

المفاضلة المتعلقة بحجم الرمز

يحصل كل موضع استدعاء على نسخة من الرمز المضمَّن. وإذا كان جسم الدالة كبيرًا ويُستدعى من مواضع كثيرة، يزداد حجم bytecode. لذلك يُفضَّل استخدام inline مع لامبدا صغيرة كثيرة الاستدعاء.

التفاعل مع companion وtop-level

يعمل inline مع الدوال العلوية والدوال العضوية. لكنه لا يعمل مع الخصائص أو البُناة. ويجب أن تكون الدالة مرئية في موضع الاستدعاء (عادةً public أو internal).

أمثلة من المكتبة القياسية

من الدوال التي تعرفها وتستخدم inline: let وrun وapply وalso وwith وuse وsynchronized وlazy (صيغة block). ويجعل المُعدِّل inline لامبدا الخاصة بهذه الدوال بلا تكلفة.

تحقق سريع

ما الفائدة الأساسية من وضع علامة inline على دالة من الدرجة الأعلى؟

مراجعة: دوال inline

أهم النقاط:

  • تلغي inline تخصيص كائن لامبدا
  • تتيح عمليات الإرجاع غير المحلية من لامبدا
  • مطلوبة لمعاملات الأنواع reified
  • تُعد مثالية للدوال الصغيرة من الدرجة الأعلى كثيرة الاستدعاء
  • كل دوال النطاق في المكتبة القياسية تستخدم inline

الأسئلة الشائعة

هل درس «دوال inline: إزالة الحمل الزائد لـ Lambda» مجاني؟

نعم — نص درس «دوال inline: إزالة الحمل الزائد لـ Lambda» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «دوال inline: إزالة الحمل الزائد لـ Lambda»؟

ضع علامة inline على الدوال لتجنّب إنشاء كائنات لمعاملات lambda. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «دوال inline: إزالة الحمل الزائد لـ Lambda»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. دوال inline: إزالة الحمل الزائد لـ Lambda
  2. معدّلا noinline وcrossinline
  3. معاملات النوع reified: الوصول إلى T وقت التشغيل
  4. أنماط reified العملية: التحليل وDI والتسلسل
← العودة إلى Kotlin Academy