Middle+
A cosa serve il modificatore `crossinline` in Kotlin?
sobes.tech AI
Risposta dell'AI
Il modificatore crossinline viene utilizzato per contrassegnare i parametri lambda delle funzioni inline.
Indica al compilatore che la lambda corrispondente non può effettuare un ritorno non locale (non-local return), cioè usare l'istruzione return per uscire dalla funzione esterna. Tuttavia, la lambda può ancora essere inserita (inlined) nel punto della chiamata.
Esempio:
// Funzione inline normale con ritorno non locale
inline fun runTask(task: () -> Unit) {
task() // È possibile un ritorno non locale da task()
println("Task completato")
}
// Funzione inline con parametro crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
// Blocco try-finally come esempio, dove è necessario crossinline
try {
task() // NON è permesso fare un ritorno non locale da task()
} finally {
println("Pulizia")
}
println("Task sicuro completato")
}
fun main() {
// Uso di runTask
runTask {
println("Dentro la lambda di runTask")
return // PERMESSO: ritorno non locale da main()
}
// La stampa "Task completato" NON sarà eseguita
// Uso di runSafeTask
runSafeTask {
println("Dentro la lambda di runSafeTask")
// return // ERRORE DI COMPILAZIONE: ritorno non locale proibito
}
println("Dopo il task sicuro") // Questa stampa sarà eseguita
}
Quando è utile:
- Quando si vuole garantire che il codice dopo la chiamata alla lambda
crossinlinevenga eseguito (ad esempio, in blocchitry-finally). - Quando la lambda viene passata come argomento a un'altra funzione che potrebbe non essere inline, e si desidera impedire un ritorno non locale che potrebbe interrompere il flusso di esecuzione.