Sobes.tech
Middle+

Do czego służy modyfikator `crossinline` w Kotlinie?

sobes.tech AI

Odpowiedź od AI

Modyfikator crossinline jest używany do oznaczania parametrów lambda funkcji inline.

Wskazuje kompilatorowi, że odpowiednia lambda nie może wykonywać powrotu nie-lokalnego (non-local return), czyli używać instrukcji return do opuszczenia funkcji zewnętrznej. Lambda nadal może być wstawiona (inlined) w miejscu wywołania.

Przykład:

// Zwykła funkcja inline z powrotem nie-lokalnym
inline fun runTask(task: () -> Unit) {
    task() // Dozwolony powrót nie-lokalny z task()
    println("Zadanie zakończone")
}

// Funkcja inline z parametrem crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // blok try-finally jako przykład, gdzie potrzebny jest crossinline
    try {
        task() // NIE można wykonać powrotu nie-lokalnego z task()
    } finally {
        println("Sprzątanie")
    }
    println("Bezpieczne zadanie zakończone")
}

fun main() {
    // Użycie runTask
    runTask {
        println("Wewnątrz lambda runTask")
        return // DOzwolone: powrót nie-lokalny z main()
    }
    // Druk "Zadanie zakończone" NIE zostanie wykonany

    // Użycie runSafeTask
    runSafeTask {
        println("Wewnątrz lambda runSafeTask")
        // return // BŁĄD KOMPILACJI: powrót nie-lokalny zabroniony
    }
    println("Po bezpiecznym zadaniu") // Ten druk zostanie wykonany
}

Kiedy to jest przydatne:

  • Gdy chcesz zagwarantować, że kod po wywołaniu lambda crossinline zostanie wykonany (np. w blokach try-finally).
  • Gdy lambda jest przekazywana jako argument do innej funkcji, która może nie być inline, i chcesz zapobiec powrotowi nie-lokalnemu, który mógłby zakłócić przepływ wykonania.