Sobes.tech
Middle+

Kam skirta `crossinline` modifikatoriaus naudojimas Kotlin'e?

sobes.tech AI

Atsakymas iš AI

crossinline keitiklis naudojamas inline funkcijų lambda parametrų žymėjimui.

Jis nurodo kompiliatoriui, kad atitinkama lambda negali atlikti non-local return (t.y., naudoti return teiginį išeiti iš išorinės funkcijos). Tačiau lambda vis dar gali būti įterpta (inlined) į iškvietimo vietą (inlined).

Pavyzdys:

// Įprasta inline funkcija su non-local return
inline fun runTask(task: () -> Unit) {
    task() // Non-local return iš task() yra įmanomas
    println("Užduotis baigta")
}

// inline funkcija su crossinline parametru
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally blokas kaip pavyzdys, kur reikalingas crossinline
    try {
        task() // NEleidžiama atlikti non-local return iš task()
    } finally {
        println("Valymas")
    }
    println("Saugus užduoties pabaiga")
}

fun main() {
    // Naudojimas su runTask
    runTask {
        println("Viduje lambda iš runTask")
        return // LEIDŽIAMA: non-local return iš main()
    }
    // "Užduotis baigta" nebus išspausdinta

    // Naudojimas su runSafeTask
    runSafeTask {
        println("Viduje lambda iš runSafeTask")
        // return // KLAIDA: draudžiama non-local return
    }
    println("Po saugios užduoties") // Šis spausdinimas bus atliktas
}

Kada tai naudinga:

  • Kai norite užtikrinti, kad kodas po crossinline lambda iškvietimo bus vykdomas (pvz., try-finally blokuose).
  • Kai lambda perduodama kaip argumentas kitai funkcijai, kuri gali būti ne inline, ir norite išvengti non-local return, kuris galėtų sutrikdyti vykdymo srautą.