Sobes.tech
Middle+

À quoi sert le modificateur `crossinline` en Kotlin?

sobes.tech IA

Réponse de l'IA

Le modificateur crossinline est utilisé pour marquer les paramètres lambda des fonctions inline.

Il indique au compilateur que la lambda correspondante ne peut pas effectuer de retour non local (non-local return), c'est-à-dire utiliser l'instruction return pour sortir de la fonction externe. Cependant, la lambda peut toujours être insérée (inlined) à l'endroit de l'appel.

Exemple :

// Fonction inline normale avec retour non local
inline fun runTask(task: () -> Unit) {
    task() // Retour non local possible depuis task()
    println("Tâche terminée")
}

// Fonction inline avec paramètre crossinline
inline fun runSafeTask(crossinline task: () -> Unit) {
    // Bloc try-finally comme exemple, où crossinline est nécessaire
    try {
        task() // IL EST INTERDIT de faire un retour non local depuis task()
    } finally {
        println("Nettoyage")
    }
    println("Tâche sécurisée terminée")
}

fun main() {
    // Utilisation de runTask
    runTask {
        println("Dans la lambda de runTask")
        return // PERMIS : retour non local depuis main()
    }
    // L'impression "Tâche terminée" ne sera PAS effectuée

    // Utilisation de runSafeTask
    runSafeTask {
        println("Dans la lambda de runSafeTask")
        // return // ERREUR DE COMPILATION : retour non local interdit
    }
    println("Après la tâche sécurisée") // Cette impression sera effectuée
}

Quand cela est utile :

  • Lorsqu'il est nécessaire de garantir que le code après l'appel à la lambda crossinline sera exécuté (par exemple, dans des blocs try-finally).
  • Lorsqu'une lambda est passée en argument à une autre fonction qui peut ne pas être inline, et que vous souhaitez empêcher un retour non local qui pourrait interrompre le flux d'exécution.