Sobes.tech
Middle+

Kotlin'da `crossinline` modifikatori nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

crossinline o'zgartiruvchisi inline-funksiyalarning lambda parametrlari uchun ishlatiladi.

U kompilatorga, mos lambda non-local return (ya'ni, return yordamida tashqi funksiyadan chiqish) qilmasligini ko'rsatadi. Biroq, lambda hali ham chaqirish joyida inlined bo'lishi mumkin (inlined).

Misol:

// Oddiy inline-funksiya, non-local return bilan
inline fun runTask(task: () -> Unit) {
    task() // task() dan non-local return mumkin
    println("Vazifa tugadi")
}

// crossinline parametrli inline-funksiya
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally blok misol uchun, bu yerda crossinline kerak
    try {
        task() // task() dan non-local return qilish mumkin emas
    } finally {
        println("Tozalash")
    }
    println("Xavfsiz vazifa tugadi")
}

fun main() {
    // runTask dan foydalanish
    runTask {
        println("runTask lambda ichida")
        return // RUXSAT: main() dan non-local return
    }
    // "Vazifa tugadi" chop etilmaydi

    // runSafeTask dan foydalanish
    runSafeTask {
        println("runSafeTask lambda ichida")
        // return // KODNI KOMPILYATSIYA XATOSI: non-local return taqiqlangan
    }
    println("Xavfsiz vazfadan keyin") // Bu chop etiladi
}

Qachon foydali:

  • crossinline lambda chaqirilgandan keyin kod bajarilishini ta'minlash uchun (masalan, try-finally bloklarida).
  • Lambda boshqa funksiyaga argument sifatida uzatilganda va siz non-local returnni oldini olishni istasangiz, bu foydalidir.