Sobes.tech
Middle+

Zašto se koristi ključna reč crossinline u Kotlinu?

sobes.tech АИ

Одговор од АИ

crossinline се користи у Kotlin-у за означавање параметара функција у inline функцијама. Ово омогућава позивање таквог lambda параметра унутар унутрашњих функција (као што су објекти анонимних класа) које нису inline.

Обични lambda-ји у inline функцијама могу садржати нелокалне повратке (повратке које излазе из спољашње функције). Lambda означена са crossinline не може садржати нелокалне повратке.

Главни циљ:

  • Омогућити коришћење lambda у контекстима где подразумевани inline lambda (са могућношћу нелокалног повратка) не може бити коришћен (нпр. анонимни објекти, локалне функције).
  • Предујмити нелокалне повратке из lambda када то није жељено или није могуће због структуре кода (нпр. при преносу lambda-ја другом току).

Пример:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Креирање анонимног Runnable објекта
    val runnable = object : Runnable {
        override fun run() {
            block() // Коришћење crossinline lambda унутар
            // овде block() не може извршити нелокално повратак из runAsyncAndFinish
        }
    }
    // Покретање у посебном току (пример)
    Thread(runnable).start()
    // ако block није crossinline, block() би могао да направи return из runAsyncAndFinish
    // што није могуће из другог тока од оног који га позива
}

fun testCrossinline() {
    println("Пре runAsyncAndFinish")
    runAsyncAndFinish {
        println("Унутар асинхроног блока")
        // return // Грешка при компилацији: не може се користити нелокално return са crossinline
    }
    println("Након runAsyncAndFinish")
}