Sobes.tech
Middle+

Kotlin-də `crossinline` modifikatoru nə üçün istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

crossinline dəyişdiricisi inline funksiyaların lambda parametrlərini işarələmək üçün istifadə olunur.

O, tərtibçiyə bildirir ki, müvafiq lambda non-local return (yəni, return istifadə edərək xarici funksiyadan çıxış) edə bilməz, yəni return bəyanatını istifadə edərək xarici funksiyadan çıxmaq mümkün deyil. Ancaq, lambda hələ də çağrı yerində inlined ola bilər (inlined).

Nümunə:

// Adi inline-funksiya, non-local return ilə
inline fun runTask(task: () -> Unit) {
    task() // task()-dan non-local return mümkündür
    println("Tapşırıq tamamlandı")
}

// crossinline parametrli inline-funksiya
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally bloku nümunə üçün, burada crossinline lazımdır
    try {
        task() // task()-dan non-local return etmək YOXDUR
    } finally {
        println("Təmizləmə")
    }
    println("Təhlükəsiz tapşırıq tamamlandı")
}

fun main() {
    // runTask istifadə
    runTask {
        println("runTask lambda daxilində")
        return // İZİN VERİLİR: main()-dən non-local return
    }
    // "Tapşırıq tamamlandı" çap olunmayacaq

    // runSafeTask istifadə
    runSafeTask {
        println("runSafeTask lambda daxilində")
        // return // KOMPİLATOR XƏTASI: non-local return qadağandır
    }
    println("Təhlükəsiz tapşırıqdan sonra") // Bu çap ediləcək
}

Nə zaman faydalıdır:

  • crossinline lambda çağırıldıqdan sonra kodun icra olunmasını təmin etmək istəyirsinizsə (məsələn, try-finally bloklarında).
  • Lambda başqa funksiyaya arqument kimi ötürülür və siz non-local return-un qarşısını almaq istəyirsinizsə, bu faydalıdır.