ProgrammatieKotlin ontwikkelaar

Hoe werkt 'vararg' in Kotlin? Beschrijf de regels voor overdracht, beperkingen, interactie met gangbare patronen en typische problemen bij het combineren met benoembare en gewone argumenten.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

  • Gewone syntaxis: fun foo(vararg numbers: Int)
  • Een argument met 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).
  • Je kunt zowel afzonderlijke waarden als een array doorgeven (met behulp van de spread-operator *).
  • Een functie met vararg kan worden aangeroepen zonder waarden voor dit argument door te geven.

Voorbeeldcode

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)

Misleidende vraag.

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

Voorbeelden van echte fouten door gebrek aan kennis over de details van het onderwerp.


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.