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
crossinlinezostanie wykonany (np. w blokachtry-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.