Sobes.tech
Middle+

Kam paredzēts `crossinline` modifikators Kotlin?

sobes.tech AI

Atbilde no AI

Modifikators crossinline tiek izmantots, lai atzīmētu inline funkciju lambda parametrus.

Tas norāda kompilatoram, ka attiecīgā lambda funkcija nevar veikt ne lokālu, ne nolineālu atgriešanos (non-local return), tas ir, izmantot return operatoru, lai izietu no ārējās funkcijas. Tajā pašā laikā lambda joprojām var tikt iekļauta (inlined) izsaukuma vietā.

Piemērs:

// Parasta inline funkcija ar ne lokālu atgriešanos
inline fun runTask(task: () -> Unit) {
    task() // Ne lokāla atgriešanās ir iespējama no task()
    println("Uzdevums pabeigts")
}

// inline funkcija ar crossinline parametru
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally bloks piemēram, kur nepieciešams crossinline
    try {
        task() // NEvar veikt ne lokālu, ne nolineālu atgriešanos no task()
    } finally {
        println("Tīrīšana")
    }
    println("Droša uzdevuma pabeigšana")
}

fun main() {
    // Izmantošana runTask
    runTask {
        println("Iekšā runTask lambda")
        return // IESPĒJAMS: ne lokāla atgriešanās no main()
    }
    // Izvade "Uzdevums pabeigts" NE tiks izpildīta

    // Izmantošana runSafeTask
    runSafeTask {
        println("Iekšā runSafeTask lambda")
        // return // KĻŪDA KOMPILĀCIJĀ: ne lokāla atgriešanās ir aizliegta
    }
    println("Pēc drošas uzdevuma izpildes") // Šī izvade tiks izpildīta
}

Kad tas ir noderīgi:

  • Kad nepieciešams nodrošināt, ka kods pēc crossinline lambda funkcijas izsaukuma tiks izpildīts (piemēram, try-finally blokos).
  • Kad lambda tiek nodota kā arguments citai funkcijai, kas var nebūt iekļauta, un vēlaties novērst ne lokālu atgriešanos, kas varētu pārtraukt izpildes plūsmu.