0Pricing
Kotlin Academy · Lezione

Modificatori noinline e crossinline

Controlli il comportamento di inlining per specifici parametri lambda nelle funzioni inline.

Modificatori noinline e crossinline è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Il problema risolto da inline e quello che introduce

Quando una funzione è inline, tutti i suoi parametri lambda vengono sottoposti a inlining per impostazione predefinita. A volte è necessario che una lambda specifica non venga sottoposta a inlining, ad esempio per memorizzarla o passarla a un'altra funzione non inline.

noinline: mantenere una lambda come oggetto

Anteponete noinline a uno specifico parametro lambda per escluderlo dall'inlining, mantenendo le altre lambda sottoposte a inlining.

inline fun doWork(
    action: () -> Unit,
    noinline callback: () -> Unit   // stored, not inlined
) {
    action()                        // inlined at call site
    scheduleCallback(callback)      // passed as object — valid
}

Quando è necessario noinline

È necessario utilizzare noinline quando la lambda viene:

  • memorizzata in una variabile o in un campo
  • passata a un'altra funzione che si aspetta un tipo funzione
  • restituita dalla funzione inline

crossinline: impedire i ritorni non locali

crossinline viene utilizzato quando una lambda sottoposta a inlining viene invocata in un contesto di esecuzione diverso, ad esempio all'interno di un'altra lambda o in un thread diverso. Indica al compilatore: esegui l'inlining di questa lambda, ma non consentire ritorni non locali al suo interno.

inline fun runAsync(crossinline block: () -> Unit) {
    Thread {
        block()   // block is inlined but cannot use non-local return
    }.start()
}

Perché i ritorni non locali sono rischiosi in questo caso

Se block potesse utilizzare un return non locale, tenterebbe di restituire il controllo dalla funzione che ha chiamato runAsync. Tuttavia, quando il thread viene eseguito, quella funzione potrebbe essere già terminata, causando un comportamento indefinito. crossinline lo impedisce in fase di compilazione.

Combinare noinline e crossinline

Una singola funzione inline può combinare parametri normali, noinline e crossinline:

inline fun orchestrate(
    crossinline setup: () -> Unit,
    action: () -> Unit,
    noinline teardown: () -> Unit
) {
    Thread { setup() }.start()
    action()
    register(teardown)
}

Errore del compilatore senza crossinline

Se si passa una lambda sottoposta a inlining a un contesto lambda senza crossinline, il compilatore restituisce: "Impossibile eseguire l'inlining di 'block' qui: potrebbe contenere ritorni non locali. Aggiunga il modificatore crossinline."

Utilizzo nella libreria standard

La libreria standard utilizza crossinline in funzioni come Sequence { } e in alcuni builder di coroutine, garantendo che la lambda fornita dall'utente venga eseguita in modo sicuro in un contesto diverso.

noinline non disattiva inline

Contrassegnare un parametro come noinline non disattiva l'inlining per l'intera funzione. Il corpo della funzione e tutti gli altri parametri lambda vengono comunque sottoposti a inlining. Solo la lambda contrassegnata con noinline conserva la propria identità di oggetto.

Considerazioni sulle prestazioni

noinline comporta il normale costo di allocazione di una lambda per quel parametro. crossinline esegue comunque l'inlining: l'unica limitazione consiste nel vietare i ritorni non locali. Nessuno dei due modificatori influisce sull'inlining degli altri parametri.

Tabella riepilogativa

Riepilogo dei modificatori:

  • nessun modificatore → lambda completamente sottoposta a inlining, con ritorni non locali consentiti
  • noinline → lambda mantenuta come oggetto, memorizzabile o passabile
  • crossinline → lambda sottoposta a inlining, con ritorni non locali vietati

Verifica rapida

Quando è necessario utilizzare noinline su un parametro lambda di una funzione inline?

Riepilogo: noinline e crossinline

Punti chiave:

  • noinline: mantiene una lambda come oggetto all'interno di una funzione altrimenti inline
  • crossinline: esegue l'inlining della lambda, ma vieta i ritorni non locali per consentirne l'uso sicuro tra contesti diversi
  • entrambi i modificatori si applicano ai singoli parametri, non all'intera funzione

Domande Frequenti

La lezione «Modificatori noinline e crossinline» è gratuita?

Sì — il testo completo di «Modificatori noinline e crossinline» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «Modificatori noinline e crossinline»?

Controlli il comportamento di inlining per specifici parametri lambda nelle funzioni inline. Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Modificatori noinline e crossinline»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Funzioni inline: eliminare l'overhead delle lambda
  2. Modificatori noinline e crossinline
  3. Parametri di tipo reified: accedere a T a runtime
  4. Pattern reified pratici: parsing, DI e serializzazione
← Torna a Kotlin Academy