Het trefwoord vararg in Kotlin laat een functie toe om een variabel aantal argumenten te accepteren. Dit is equivalent aan arrays in Java, maar met extra syntactische suiker.
Regels en beperkingen:
fun foo(vararg numbers: Int)vararg moet de laatste zijn onder de parameters van de functie (als er na dit argument nog parameters zijn, moeten deze bij de aanroep benoembaar zijn).*).vararg kan worden aangeroepen zonder waarden voor dit argument door te geven.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // werkt printAll(*arr) // spread (ontvouwt de array)
Kun je twee 'vararg'-parameters in één functie declareren of 'vararg' niet als laatste plaatsen?
Antwoord: Nee, in Kotlin kun je slechts één vararg gebruiken in de functieverklaring, en het moet altijd de laatste zijn van de positionele argumenten. Als je na vararg een gewone parameter toevoegt, kan deze alleen bij naam worden doorgegeven.
Voorbeeld:
fun foo(vararg items: String, prefix: String) // Compilatiefout! // Correct: fun foo(vararg items: String, vararg items2: Int) // Compilatiefout! // Werkt: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Verhaal
Een jonge programmeur dacht ten onrechte dat het mogelijk was om twee vararg-parameters tegelijk te declareren. De architectuur van de functie was zodanig opgebouwd dat de splitsing op meerdere niveaus van aanroepen plaatsvond. Dit leidde tot een keten van refactoringen - de logica van de te ontvangen gegevens moest worden herzien en alle aanroepen herschreven.
Verhaal
In een Android-project vergaten ze de spread-operator * te gebruiken bij het doorgeven van een array aan een functie met een vararg-parameter: printAll(arr) in plaats van printAll(*arr). Als gevolg hiervan, in plaats van het afdrukken van de elementen, werd de array als één string met het objectadres weergegeven, wat leidde tot een vreemd gedrag van de applicatie.
Verhaal
In een functie met vararg en extra benoembare parameters fun foo(vararg a: Int, b: Int) werden aanroepen via positionele argumenten verkeerd geïnterpreteerd: de compiler kon niet bepalen waar de lijst voor vararg eindigde en waar het argument b begon, wat leidde tot compilatiefouten. Besloten werd om expliciet argumentnamen te gebruiken voor dergelijke parameters.