Middle+
Para que é que é utilizado o modificador `crossinline` em Kotlin?
sobes.tech IA
Resposta da IA
O modificador crossinline é utilizado para marcar os parâmetros lambda de funções inline.
Indica ao compilador que a lambda correspondente não pode realizar um retorno não local (non-local return), ou seja, usar a instrução return para sair da função externa. No entanto, a lambda ainda pode ser inserida (inlined) no local da chamada.
Exemplo:
// Função inline normal com retorno não local
inline fun runTask(task: () -> Unit) {
task() // Retorno não local possível de task()
println("Tarefa finalizada")
}
// Função inline com parâmetro crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
// Bloco try-finally como exemplo, onde é necessário crossinline
try {
task() // NÃO é permitido fazer retorno não local de task()
} finally {
println("Limpeza")
}
println("Tarefa segura finalizada")
}
fun main() {
// Uso de runTask
runTask {
println("Dentro da lambda de runTask")
return // PERMITIDO: retorno não local de main()
}
// A impressão "Tarefa finalizada" NÃO será executada
// Uso de runSafeTask
runSafeTask {
println("Dentro da lambda de runSafeTask")
// return // ERRO DE COMPILAÇÃO: retorno não local proibido
}
println("Depois da tarefa segura") // Esta impressão será executada
}
Quando é útil:
- Quando é necessário garantir que o código após a chamada à lambda
crossinlineseja executado (por exemplo, em blocostry-finally). - Quando a lambda é passada como argumento para outra função que pode não ser inline, e você deseja evitar um retorno não local que possa interromper o fluxo de execução.