Kotlin: funzioni inline

Utilizzare funzioni di ordine elevato significa utilizzare funzioni che, in Kotlin, vengono istanziate come oggetti di classi anonime. Questo meccanismo porta ad un overhead in termini di utilizzo della memoria durante l’esecuzione del programma. In molti casi, questo problema può essere eliminato attraverso il processo di inlining delle funzioni lambda. Usare una funzione in-line significa espandere il codice della funzione con i relativi parametri in corrispondenza del punto di chiamata in fase di compilazione. Le funzioni inline vengono dichiarate utilizzando la keyword inline:

inline fun functionName(param1 : type1, param2 : type2, … , paramN : typeN) : returnType { //corpo della funzione}

Dove il generico parametro paramN può essere anche una funzione. Le funzione in ingresso possono avere un return esplicito che permette il ritorno alla funzione chiamante, ad esempio:

fun main(args: Array<String> {
inlineFunction({
    println("primo parametro della funzione inline")
    return
} , {
    println("secondo parametro della funzione inline")
})
}

inline fun inlineFunction(myFun: () -> Unit, nextFun: () -> Unit) {
    myFun()
    nextFun()
    print("codice interno alla funzione inline")
}

Nell’esempio in particolare, non viene eseguita ne la seconda funzione passata come parametro alla funzione inlineFunction e neppure la stringa “codice interno alla funzione inline” in quanto il return di myFun torna direttamente alla funzione chiamante (main). Se vogliamo evitare comportamenti simili è necessario utilizzare la keyword crossline di fronte al parametro myFun. Peranto, rifacendoci al nostro esempio, la dichiarazione della funzione inlineFunction diviene:

inline fun inlineFunction(crossline myFun: () -> Unit, nextFun: () -> Unit) {
// corpo della funzione
}

in questo secondo caso, se la funzione passata come myFun contiene un return avremo un errore in fase di compilazione. Se vogliamo passare una funzione non inline come parametro ad una funzione inline è possibile utilizzare la keyword noninline. Per maggiori informazioni visitate https://kotlinlang.org/docs/inline-functions.html

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.