Modificateurs noinline et crossinline
Contrôlez le comportement d’inlining de paramètres lambda précis dans les fonctions inline.
Modificateurs noinline et crossinline est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.
Le problème résolu — et introduit — par inline
Lorsqu’une fonction est inline, tous ses paramètres lambda sont intégrés par défaut. Vous devez parfois empêcher une lambda précise d’être intégrée, par exemple pour la stocker ou la transmettre à une autre fonction qui n’est pas inline.
noinline : conserver une lambda comme objet
Préfixez un paramètre lambda précis avec noinline pour exclure ce paramètre de l’intégration tout en continuant à intégrer les autres.
inline fun doWork(
action: () -> Unit,
noinline callback: () -> Unit // stored, not inlined
) {
action() // inlined at call site
scheduleCallback(callback) // passed as object — valid
}Quand noinline est nécessaire
Vous devez utiliser noinline lorsque la lambda est :
- stockée dans une variable ou un champ
- transmise à une autre fonction qui attend un type de fonction
- renvoyée par la fonction inline
crossinline : interdire les retours non locaux
crossinline est utilisé lorsqu’une lambda intégrée sera appelée dans un autre contexte d’exécution, par exemple à l’intérieur d’une autre lambda ou dans un autre thread. Il indique au compilateur : intégrez cette lambda, mais n’autorisez pas les retours non locaux à l’intérieur.
inline fun runAsync(crossinline block: () -> Unit) {
Thread {
block() // block is inlined but cannot use non-local return
}.start()
}Pourquoi les retours non locaux sont dangereux ici
Si block pouvait utiliser un return non local, il tenterait de revenir depuis la fonction qui a appelé runAsync. Mais lorsque le thread s’exécute, cette fonction peut déjà avoir renvoyé son résultat, ce qui provoquerait un comportement indéfini. crossinline empêche cela lors de la compilation.
Combiner noinline et crossinline
Une même fonction inline peut combiner des paramètres ordinaires, noinline et crossinline :
inline fun orchestrate(
crossinline setup: () -> Unit,
action: () -> Unit,
noinline teardown: () -> Unit
) {
Thread { setup() }.start()
action()
register(teardown)
}Erreur du compilateur sans crossinline
Si vous transmettez une lambda intégrée à un contexte lambda sans crossinline, le compilateur affiche : « Impossible d’intégrer “block” ici : cette lambda peut contenir des retours non locaux. Ajoutez le modificateur crossinline. »
Utilisation dans la bibliothèque standard
La bibliothèque standard utilise crossinline dans des fonctions comme Sequence { } et certains constructeurs de coroutines, afin de garantir que la lambda fournie par l’utilisateur s’exécute sans danger dans un autre contexte.
noinline ne désactive pas inline
Marquer un paramètre avec noinline ne désactive pas l’intégration de toute la fonction. Le corps de la fonction et tous les autres paramètres lambda restent intégrés. Seule la lambda marquée noinline conserve son identité d’objet.
Considérations relatives aux performances
noinline entraîne le coût habituel de création d’une lambda pour ce paramètre. crossinline continue d’intégrer la lambda : la seule restriction consiste à interdire les retours non locaux. Aucun des deux modificateurs ne modifie l’intégration des autres paramètres.
Tableau récapitulatif
Résumé des modificateurs :
- aucun modificateur → lambda entièrement intégrée, retours non locaux autorisés
noinline→ lambda conservée comme objet, pouvant être stockée ou transmisecrossinline→ lambda intégrée, retours non locaux interdits
Vérification rapide
Quand devez-vous utiliser noinline sur un paramètre lambda d’une fonction inline ?
Récapitulatif : noinline et crossinline
À retenir :
noinline: conserve une lambda comme objet dans une fonction par ailleurs intégréecrossinline: intègre la lambda, mais interdit les retours non locaux pour permettre une utilisation sûre entre différents contextes- les deux modificateurs s’appliquent à chaque paramètre, et non à toute la fonction
Questions Fréquemment Posées
La leçon « Modificateurs noinline et crossinline » est-elle gratuite ?
Oui — le texte complet de « Modificateurs noinline et crossinline » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Modificateurs noinline et crossinline » ?
Contrôlez le comportement d’inlining de paramètres lambda précis dans les fonctions inline. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Kotlin Academy ?
Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Modificateurs noinline et crossinline » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?
Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Fonctions inline : éliminer le surcoût des lambdas
- Modificateurs noinline et crossinline
- Paramètres de types reified : accéder à T à l’exécution
- Modèles pratiques avec reified : analyse, DI et sérialisation