Sobes.tech
Middle+

Zašto se koristi modifikator `crossinline` u Kotlinu?

sobes.tech АИ

Одговор од АИ

Modifikator crossinline se koristi za označavanje parametara lambda inline funkcija.

On ukazuje kompilatoru da odgovarajuća lambda ne može da izvrši non-local return (tj. da koristi naredbu return za izlazak iz spoljne funkcije). Međutim, lambda i dalje može biti umetnuta (inlined) na mestu poziva.

Primer:

// Obična inline funkcija sa non-local return
inline fun runTask(task: () -> Unit) {
    task() // Non-local return iz task() je moguć
    println("Zadatak završen")
}

// inline funkcija sa crossinline parametrom
inline fun runSafeTask(crossinline task: () -> Unit) {
    // try-finally blok kao primer, gde je potreban crossinline
    try {
        task() // NIJE dozvoljeno da se uradi non-local return iz task()
    } finally {
        println("Čišćenje")
    }
    println("Siguran zadatak završen")
}

fun main() {
    // Korišćenje runTask
    runTask {
        println("Unutar lambda od runTask")
        return // DOZVOLJENO: non-local return iz main()
    }
    // Ispis "Zadatak završen" neće biti izvršen

    // Korišćenje runSafeTask
    runSafeTask {
        println("Unutar lambda od runSafeTask")
        // return // GREŠKA KOMPLAJERA: zabranjen non-local return
    }
    println("Posle sigurnog zadatka") // Ovaj ispis će biti izvršen
}

Kada je korisno:

  • Kada želite da osigurate da će kod nakon poziva crossinline lambda biti izvršen (npr. u try-finally blokovima).
  • Kada se lambda prosleđuje kao argument drugoj funkciji koja možda nije inline, i želite da sprečite non-local return koji bi mogao prekinuti tok izvršenja.