Sobes.tech
Middle+

Kokia yra crossinline raktažodžio paskirtis Kotlin?

sobes.tech AI

Atsakymas iš AI

crossinline yra naudojamas Kotlin kalboje žymėti funkcijų parametrus inline funkcijose. Tai leidžia iškviesti tokį lambda parametrą viduje įdėtinių funkcijų (pavyzdžiui, anoniminių klasių objektų), kurios nėra inline.

Įprasti lambda funkcijos inline funkcijose gali turėti ne vietinius grįžimus (grįžimus, išeinančius iš išorinės funkcijos). Lambda, pažymėta crossinline, negali turėti ne vietinių grįžimų.

Pagrindinis tikslas:

  • Leisti naudoti lambda kontekstuose, kur standartinė inline lambda (su galimybe ne vietiniam grįžimui) negali būti naudojama (pavyzdžiui, anoniminių objektų, vietinių funkcijų atveju).
  • Užkirsti kelią ne vietiniams grįžimams iš lambda, kai tai nėra pageidautina arba neįmanoma dėl kodo struktūros (pavyzdžiui, perduodant lambda kitam srautui).

Pavyzdys:

inline fun runAsyncAndFinish(crossinline block: () -> Unit) {
    // Sukurti anonimį Runnable objektą
    val runnable = object : Runnable {
        override fun run() {
            block() // crossinline lambda naudojimas viduje
            // čia block() negali atlikti ne vietinio grįžimo iš runAsyncAndFinish
        }
    }
    // Paleisti atskirame sraute (pavyzdys)
    Thread(runnable).start()
    // jei block nebūtų crossinline, block() galėtų atlikti return iš runAsyncAndFinish
    // kas nėra įmanoma iš kito srauto, nei tas, kuris kviečia
}

fun testCrossinline() {
    println("Prieš runAsyncAndFinish")
    runAsyncAndFinish {
        println("Asinchroninio bloko viduje")
        // return // Kompiliatoriaus klaida: neleidžiama naudoti ne vietinio return su crossinline
    }
    println("Po runAsyncAndFinish")
}