Le mot-clé vararg en Kotlin permet à une fonction d'accepter un nombre variable d'arguments. C'est l'équivalent des tableaux en Java, mais avec un sucre syntaxique supplémentaire.
Règles et limitations :
fun foo(vararg numbers: Int)vararg doit être le dernier parmi les paramètres de la fonction (s'il y a des paramètres après, ceux-ci doivent être nommés lors de l'appel).*).vararg peut être appelée sans passer de valeurs pour cet argument.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // cela fonctionnera printAll(*arr) // propagation (déroule le tableau)
Peut-on déclarer deux paramètres 'vararg' dans une même fonction ou placer 'vararg' pas en dernier ?
Réponse : Non, en Kotlin, on ne peut utiliser qu'un seul vararg dans la déclaration d'une fonction, il doit toujours être le dernier parmi les arguments positionnels. Si on ajoute un paramètre ordinaire après, il ne peut être transmis que par son nom.
Exemple :
fun foo(vararg items: String, prefix: String) // Erreur de compilation ! // Correct : fun foo(vararg items: String, vararg items2: Int) // Erreur de compilation ! // Fonctionne : fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Histoire
Un jeune programmeur pensait à tort qu'il était possible de déclarer deux paramètres vararg en même temps. L'architecture de la fonction était telle que la séparation se faisait à plusieurs niveaux d'appels. Cela a conduit à une chaîne de refactorisations - il a fallu revoir la logique des données acceptées et réécrire tous les appels.
Histoire
Dans un projet Android, on a oublié d'utiliser l'opérateur de propagation * lors de la transmission d'un tableau à une fonction avec un paramètre vararg : printAll(arr) au lieu de printAll(*arr). En conséquence, au lieu d'imprimer les éléments, le tableau a été affiché comme une seule chaîne avec l'adresse de l'objet, ce qui a conduit à un comportement étrange de l'application.
Histoire
Dans une fonction avec vararg et des paramètres nommés supplémentaires fun foo(vararg a: Int, b: Int), les appels via des arguments positionnels ont été mal interprétés : le compilateur ne pouvait pas déterminer où se terminait la liste pour vararg et où commençait l'argument b, entraînant des erreurs de compilation. Ils ont décidé d'utiliser explicitement les noms des arguments pour de tels paramètres.