0Pricing
Kotlin Academy · درس

الفهرسة والاستدعاء

get وset وinvoke

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

عامل الفهرسة

يتيح تعريف operator fun get القراءة باستخدام صيغة الأقواس المعقوفة: obj[i].

class Row(val cells: List<String>) {
    operator fun get(i: Int) = cells[i]
}

fun main() {
    val r = Row(listOf("a", "b", "c"))
    println(r[1])
}

الكتابة باستخدام set

يتيح operator fun set الإسناد: obj[i] = value. ويكون المعامل الأخير هو القيمة.

class Grid {
    private val data = IntArray(3)
    operator fun get(i: Int) = data[i]
    operator fun set(i: Int, value: Int) { data[i] = value }
}

fun main() {
    val g = Grid()
    g[0] = 42
    println(g[0])
}

الفهرسة بعدة معاملات

يمكن أن يستقبل get وset عدة فهارس، وهو ما يناسب المصفوفات جيدًا.

class Matrix {
    private val d = Array(2) { IntArray(2) }
    operator fun get(r: Int, c: Int) = d[r][c]
    operator fun set(r: Int, c: Int, v: Int) { d[r][c] = v }
}

fun main() {
    val m = Matrix()
    m[1, 1] = 9
    println(m[1, 1])
}

الفهرسة باستخدام مفاتيح غير Int

يمكن أن تكون معاملات الفهرسة من أي نوع، مما يتيح الوصول بطريقة شبيهة بالخرائط.

class Settings {
    private val map = mutableMapOf<String, String>()
    operator fun get(key: String) = map[key]
    operator fun set(key: String, value: String) { map[key] = value }
}

fun main() {
    val s = Settings()
    s["theme"] = "dark"
    println(s["theme"])
}

عامل الاستدعاء

يتيح تعريف operator fun invoke استدعاء مثيل كما لو كان دالة: obj().

class Greeter(val name: String) {
    operator fun invoke() = "Hello, $name"
}

fun main() {
    val g = Greeter("Sam")
    println(g())
}

استدعاء invoke باستخدام معاملات

يمكن أن يستقبل invoke معاملات، مما يجعل الكائن يتصرف كدالة ذات معاملات.

class Multiplier(val factor: Int) {
    operator fun invoke(x: Int) = x * factor
}

fun main() {
    val triple = Multiplier(3)
    println(triple(5))
}

كائنات قابلة للاستدعاء ذات حالة

بما أن الكائن يحتفظ بحالته، يمكن لـ invoke إنشاء كائنات قابلة للتهيئة وتشبه الدوال.

class Accumulator {
    var total = 0
    operator fun invoke(n: Int) { total += n }
}

fun main() {
    val acc = Accumulator()
    acc(5)
    acc(10)
    println(acc.total)
}

أحمال زائدة متعددة لـ invoke

يمكنكم التصريح بعدة أحمال زائدة لـ invoke باستخدام معاملات مختلفة.

class Printer {
    operator fun invoke(s: String) = println(s)
    operator fun invoke(n: Int) = println("num: $n")
}

fun main() {
    val p = Printer()
    p("hi")
    p(7)
}

الفهرسة في التعبيرات

تتآلف عملية الوصول بالفهرس طبيعيًا مع العمليات الأخرى.

class Scores(private val list: List<Int>) {
    operator fun get(i: Int) = list[i]
}

fun main() {
    val s = Scores(listOf(10, 20, 30))
    println(s[0] + s[2])
}

الجمع بين get وinvoke

يمكن لنوع ما دعم الفهرسة والاستدعاء معًا لتوفير واجهة برمجية مرنة وواضحة.

class Lookup(private val data: Map<String, Int>) {
    operator fun get(key: String) = data[key]
    operator fun invoke() = data.size
}

fun main() {
    val l = Lookup(mapOf("a" to 1))
    println(l["a"])
    println(l())
}

كيفية استخدام المكتبة القياسية لهما

إن list[i] في List وmap[key] في Map هما بالضبط هذان العاملان. ويمكن لأنواعكم أن تتصرف بالطبيعية نفسها.

fun main() {
    val list = listOf(1, 2, 3)
    val map = mapOf("x" to 9)
    println(list[0])
    println(map["x"])
}

تحقق سريع

اختبروا مدى فهمكم للفهرسة وinvoke.

مراجعة

لقد تعلمتم الفهرسة وinvoke:

  • يدعم get التعبير obj[i]، ويدعم set التعبير obj[i] = v.
  • تدعم عوامل الفهرسة مفاتيح متعددة ومفاتيح ليست من النوع Int.
  • يتيح invoke استدعاء النسخ كما لو كانت دوال، سواء بوسائط أم من دونها.
  • تستخدم المجموعات القياسية هذين العاملين بالضبط.
class Box {
    private val m = mutableMapOf<String, Int>()
    operator fun get(k: String) = m[k]
    operator fun set(k: String, v: Int) { m[k] = v }
}

fun main() {
    val b = Box()
    b["x"] = 5
    println(b["x"])
}

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

هل درس «الفهرسة والاستدعاء» مجاني؟

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

ماذا ستتعلم في «الفهرسة والاستدعاء»؟

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

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

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

كم من الوقت يستغرق درس «الفهرسة والاستدعاء»؟

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

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

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

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

  1. دوال المعاملات
  2. معاملات المقارنة
  3. الفهرسة والاستدعاء
  4. أفضل الممارسات
← العودة إلى Kotlin Academy