Sobes.tech
Middle+

Mit használ a `crossinline` módosító Kotlinban?

sobes.tech MI

Válasz az MI-től

A crossinline módosító az inline függvények lambda paramétereinek megjelölésére szolgál.

Azt jelzi a fordítónak, hogy a megfelelő lambda nem hajthat végre nem helyi visszatérést (non-local return), azaz nem használhatja a return utasítást a külső függvényből való kilépéshez. Ugyanakkor a lambda továbbra is beilleszthető (inlined) a hívás helyén.

Példa:

// Normál inline függvény nem helyi visszatéréssel
inline fun runTask(task: () -> Unit) {
    task() // Nem helyi visszatérés megengedett a task()-ból
    println("Feladat befejezve")
}

// crossinline paraméterrel ellátott inline függvény
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally blokk példaként, ahol szükség van crossinline-ra
    try {
        task() // NEM szabad nem helyi visszatérést végrehajtani a task()-ból
    } finally {
        println("Takarítás")
    }
    println("Biztonságos feladat befejezve")
}

fun main() {
    // A runTask használata
    runTask {
        println("A runTask lambda belseje")
        return // ENGEDÉLYEZETT: nem helyi visszatérés a main()-ből
    }
    // A "Feladat befejezve" nyomtatás NEM fog megtörténni

    // A runSafeTask használata
    runSafeTask {
        println("A runSafeTask lambda belseje")
        // return // Fordító hiba: nem engedélyezett nem helyi visszatérés
    }
    println("A biztonságos feladat után") // Ez a nyomtatás végrehajtódik
}

Mikor hasznos:

  • Amikor garantálni szeretnéd, hogy a crossinline lambda hívása után a kód végrehajtódik (pl. try-finally blokkokban).
  • Amikor a lambda másik függvény argumentumaként kerül átadásra, amely nem inline, és el akarod kerülni a nem helyi visszatérést, ami megszakíthatja a végrehajtás folyamatát.