Sobes.tech
Middle+

Milleks kasutatakse `crossinline` modifikatsiooni Kotlinis?

sobes.tech AI

Vastus AI-lt

Modifikator crossinline kasutatakse inline-funktsioonide lambda-parameetrite märkimiseks.

See näitab kompilaatorile, et vastav lambda-funktsioon ei saa teha mitte-lokaalset tagasipöördumist (non-local return), st kasutada return-i, et väljuda välisfunktsioonist. Samal ajal võib lambda siiski olla sisestatud (inlined) kutsumiskohta.

Näide:

// Tavaline inline-funktsioon mitte-lokaalse tagasipöördumisega
inline fun runTask(task: () -> Unit) {
    task() // Mitte-lokaalne tagasipöördumine on võimalik task()-ist
    println("Ülesanne lõpetatud")
}

// inline-funktsioon crossinline-parameetriga
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally plokk näitena, kus on vaja crossinline
    try {
        task() // EI ole lubatud teha mitte-lokaalset tagasipöördumist
    } finally {
        println("Puhastamine")
    }
    println("Turvaline ülesande lõpetamine")
}

fun main() {
    // Kasutades runTask
    runTask {
        println("Ise runTask lambda sees")
        return // VÕIMALIK: mitte-lokaalne tagasipöördumine main()-st
    }
    // Prindi "Ülesanne lõpetatud" EI tehta

    // Kasutades runSafeTask
    runSafeTask {
        println("Ise runSafeTask lambda sees")
        // return // VIGA KOMPILEERIMISEL: mitte-lokaalne tagasipöördumine on keelatud
    }
    println("Pärast turvalist ülesannet") // See print teostatakse
}