Sobes.tech
Middle+

Kotlin'da crossinline kalit so'zi nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

Kotlin'da crossinline, inline funksiyalarda parametr sifatida belgilash uchun ishlatiladi. Bu, bunday lambda parametrini ichki funksiyalar (masalan, nomli sinf obyektlari kabi) ichida chaqirish imkonini beradi, ular inline emas.

Oddiy lambda'lar inline funksiyalarda, lokal bo'lmagan qaytishlarni (tashqi funksiyadan chiqadigan qaytishlar) o'z ichiga olishi mumkin. crossinline bilan belgilangan lambda, lokal bo'lmagan qaytishlarni o'z ichiga olmaydi.

Asosiy maqsad:

  • Lambda'ni, odatda, lokal bo'lmagan qaytish imkoniyati bilan inline lambda ishlatilmaydigan kontekstlarda ishlatish imkonini berish (masalan, nomli obyektlar, mahalliy funksiyalar).
  • Kod tuzilishi sababli, lambda'dan lokal bo'lmagan qaytishlarni oldini olish (masalan, lambda'ni boshqa oqimga uzatishda).

Misol:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Nomli Runnable obyektini yaratish
    val runnable = object : Runnable {
        override fun run() {
            block() // crossinline lambda'ni ichida ishlatish
            // bu yerda block() runAsyncAndFinish'dan lokal bo'lmagan qaytishni amalga oshirolmaydi
        }
    }
    // Yangi oqimda ishga tushirish (misol)
    Thread(runnable).start()
    // agar block crossinline bo'lmasa, block() runAsyncAndFinish'dan qaytishni amalga oshirishi mumkin edi
    // bu, chaqiruvchidan boshqa oqimda amalga oshirilmaydi
}

fun testCrossinline() {
    println("RunAsyncAndFinishdan oldin")
    runAsyncAndFinish {
        println("Asinxron blok ichida")
        // return // Kompilyatsiya xatosi: crossinline bilan lokal bo'lmagan return ishlata olmaysiz
    }
    println("RunAsyncAndFinishdan keyin")
}