ProgrammationDéveloppeur Kotlin

Comment fonctionne 'vararg' en Kotlin ? Décrivez les règles de transmission, les limitations, l'interaction avec les modèles courants et les difficultés typiques lors de la combinaison avec des arguments nommés et ordinaires.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Syntaxe normale : fun foo(vararg numbers: Int)
  • L'argument 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).
  • Il est possible de transmettre à la fois des valeurs individuelles et un tableau (en utilisant l'opérateur de propagation *).
  • Une fonction avec vararg peut être appelée sans passer de valeurs pour cet argument.

Exemple de code

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)

Question piégée.

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

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


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.