ProgrammazioneSviluppatore Kotlin

Come funziona 'vararg' in Kotlin? Descrivi le regole di passaggio, le limitazioni, l'interazione con modelli comuni e le difficoltà tipiche nel combinare argomenti nominati e normali.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Sintassi normale: fun foo(vararg numbers: Int)
  • L'argomento con vararg deve essere l'ultimo tra i parametri della funzione (se dopo ci sono parametri, devono essere nominati durante la chiamata).
  • È possibile passare sia valori singoli che un array (utilizzando l'operatore spread *).
  • Una funzione con vararg può essere chiamata senza passare valori per questo argomento.

Esempio di codice

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)

Domanda trabocchetto.

È 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 = "->")

Esempi di errori reali a causa della mancata conoscenza delle sottigliezze dell'argomento.


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.