La parola chiave vararg in Kotlin consente a una funzione di accettare un numero variabile di argomenti. Questo è equivalente agli array in Java, ma con un ulteriore zucchero sintattico.
Regole e limitazioni:
fun foo(vararg numbers: Int)vararg deve essere l'ultimo tra i parametri della funzione (se dopo ci sono parametri, devono essere nominati durante la chiamata).*).vararg può essere chiamata senza passare valori per questo argomento.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // funzionerà printAll(*arr) // spread (espande l'array)
È possibile dichiarare due parametri 'vararg' in una funzione o posizionare 'vararg' non per ultimo?
Risposta: No, in Kotlin è possibile utilizzare solo un vararg nella dichiarazione della funzione e deve sempre essere l'ultimo tra gli argomenti posizionali. Se dopo di esso si aggiunge un parametro normale, può essere passato solo per nome.
Esempio:
fun foo(vararg items: String, prefix: String) // Errore di compilazione! // Corretto: fun foo(vararg items: String, vararg items2: Int) // Errore di compilazione! // Funziona: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Storia
Un giovane programmatore riteneva erroneamente che fosse possibile dichiarare due parametri vararg contemporaneamente. L'architettura della funzione era costruita in modo tale che la separazione si trovava a più livelli di chiamata. Questo ha portato a una catena di refactoring — è stato necessario rivedere la logica dei dati accettati e riscrivere tutte le chiamate.
Storia
Nel progetto Android, si è dimenticato di utilizzare l'operatore spread * quando si passava un array a una funzione con un parametro vararg: printAll(arr) invece di printAll(*arr). Di conseguenza, invece di stampare gli elementi, l'array è stato stampato come una sola stringa con l'indirizzo dell'oggetto, facendo sì che l'applicazione si comportasse in modo strano.
Storia
In una funzione con vararg e parametri aggiuntivi nominati fun foo(vararg a: Int, b: Int), le chiamate tramite argomenti posizionali sono state interpretate in modo errato: il compilatore non riusciva a determinare dove finiva l'elenco per vararg e dove iniziava l'argomento b, portando a errori di compilazione. Si è deciso di utilizzare esplicitamente i nomi degli argomenti per tali parametri.