0Pricing
Kotlin Academy · درس

Lambda مع مستقبل: أساس DSL

تعرّف على أنواع الدوال ذات المستقبلات وكيف تتيح صياغة DSL.

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

ما هي لامبدا ذات مستقبل؟

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

مقارنة الصياغة

لامبدا عادية: { value: Int -> value + 1 }. ولامبدا ذات مستقبل: StringBuilder.() -> Unit — داخل هذه اللامبدا، يشير this إلى مثيل StringBuilder.

val addHello: StringBuilder.() -> Unit = {
    append("Hello")   // this = StringBuilder
    append(", World")
}

استخدام with لتطبيق لامبدا ذات مستقبل

تقبل دالة المكتبة القياسية with مستقبلًا ولامبدا ذات مستقبل. وتستدعي اللامبدا مع الكائن المحدّد بوصفه this:

val result = with(StringBuilder()) {
    append("Kotlin")
    append(" DSLs")
    toString()
}  // result = "Kotlin DSLs"

تعريف دالة بناء خاصة بك

يمكنك كتابة دوال تقبل لامبدا ذات مستقبل لإنشاء واجهات برمجة تطبيقات صغيرة للبناء:

class HtmlTag(val name: String) {
    val children = mutableListOf<HtmlTag>()
    fun render(): String = "<$name>${children.joinToString("") { it.render() }}</$name>"
}

fun div(block: HtmlTag.() -> Unit): HtmlTag {
    val tag = HtmlTag("div")
    tag.block()
    return tag
}

استدعاء دالة البناء

داخل اللامبدا، يكون this هو HtmlTag، ولذلك تتاح أعضاؤه مباشرةً:

val page = div {
    children += HtmlTag("p")
}

‏apply هي لامبدا ذات مستقبل

تُعد دالة النطاق apply أبسط مثال: فهي تستدعي لامبدا ذات مستقبل على this، ثم تعيد this:

val list = mutableListOf<Int>().apply {
    add(1)
    add(2)
    add(3)
}   // list = [1, 2, 3]

نمط DSL

تُبنى DSLs بتداخل دوال بناء، تقبل كل منها لامبدا ذات مستقبل. ويتحكم كل مستوى في مستقبله الخاص، ما يوفر بنية طبيعية ذات مسافات بادئة تعكس التسلسل الهرمي للبيانات.

html {
    head { title("My Page") }
    body {
        div {
            p("Hello!")
        }
    }
}

أنواع الدوال ذات المستقبل

يمكنك تخزين اللامبدا ذات المستقبل في متغيرات باستخدام نوع الدالة T.() -> R:

val greet: String.() -> String = { "Hello, $this!" }
println("World".greet())  // "Hello, World!"

دوال الامتداد مقابل اللامبدا ذات المستقبل

تشترك دوال الامتداد واللامبدا ذات المستقبل في الآلية نفسها: فكلاهما يوفر this ضمنيًا. والفرق هو أن دالة الامتداد تُعرَّف وقت الترجمة، بينما اللامبدا قيمة يمكن تمريرها بين أجزاء البرنامج.

تركيب اللامبدا ذات المستقبل

يمكن تركيب دوال بناء متعددة لإنشاء DSLs غنية وهرمية. والمفتاح هو أن كل دالة بناء تحدد مستقبلها الخاص، مما يحافظ على عزل النطاقات.

استنتاج النوع واللامبدا ذات المستقبل

يستنتج Kotlin نوع المستقبل من تعريف المعامل، لذلك لا يحتاج المستدعون إلى تحديد أنواع لامبدا الخاصة بهم. ويعرف المترجم ماهية this داخل الكتلة.

اختبار سريع

داخل لامبدا ذات مستقبل من النوع StringBuilder.() -> Unit، إلى ماذا يشير this؟

مراجعة: اللامبدا ذات المستقبل

أهم النقاط:

  • توفر اللامبدا ذات المستقبل this ضمنيًا داخل جسم اللامبدا
  • تُعرَّف على الشكل ReceiverType.() -> ReturnType
  • تشكل أساس جميع DSLs في Kotlin
  • تستخدمها المكتبة القياسية في apply وwith وrun وbuildString وغير ذلك

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

هل درس «Lambda مع مستقبل: أساس DSL» مجاني؟

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

ماذا ستتعلم في «Lambda مع مستقبل: أساس DSL»؟

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

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

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

كم من الوقت يستغرق درس «Lambda مع مستقبل: أساس DSL»؟

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

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

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

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

  1. Lambda مع مستقبل: أساس DSL
  2. @DslMarker: منع تسرّب المستقبلات
  3. إنشاء DSL آمن للأنواع لـ HTML/Config
  4. اختبار DSL وتطويره من دون التأثير في المستخدمين
← العودة إلى Kotlin Academy