Słowo kluczowe vararg w Kotlin pozwala funkcji przyjmować zmienną liczbę argumentów. To jest równoznaczne z tablicami w Javie, ale z dodatkowym cukrem syntaktycznym.
Zasady i ograniczenia:
fun foo(vararg numbers: Int)vararg musi być ostatnim wśród parametrów funkcji (jeśli po nim są parametry, to muszą być nazwane przy wywołaniu).*).vararg można wywołać bez przekazywania wartości tego argumentu.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // będzie działać printAll(*arr) // spread (rozkłada tablicę)
Czy można zadeklarować dwa parametry 'vararg' w jednej funkcji lub umieścić 'vararg' nie na końcu?
Odpowiedź: Nie, w Kotlinie można używać tylko jednego vararg w deklaracji funkcji, zawsze musi być ostatnim w argumentach pozycyjnych. Jeśli po nim doda się zwykły parametr, może być przekazany tylko po nazwie.
Przykład:
fun foo(vararg items: String, prefix: String) // Błąd kompilacji! // Prawidłowe: fun foo(vararg items: String, vararg items2: Int) // Błąd kompilacji! // Działa: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Historia
Młody programista błędnie zakładał, że można zadeklarować dwa vararg-parametry jednocześnie. Architektura funkcji została zbudowana w taki sposób, że podział był na kilku poziomach wywołania. Doprowadziło to do łańcucha refaktoryzacji — konieczne było przegladanie logiki przyjmowanych danych i przepisywanie wszystkich wywołań.
Historia
W projekcie na Androida zapomniano użyć operatora spread * przy przekazywaniu tablicy do funkcji z parametrem vararg: printAll(arr) zamiast printAll(*arr). W efekcie, zamiast wydrukować elementy, tablica została wyświetlona jako jeden ciąg z adresem obiektu, co sprawiło, że aplikacja zachowywała się dziwnie.
Historia
W funkcji z vararg oraz dodatkowymi parametrami nazwanymi fun foo(vararg a: Int, b: Int) wywołania poprzez argumenty pozycyjne były interpretowane niepoprawnie: kompilator nie był w stanie określić, gdzie kończy się lista dla vararg, a gdzie zaczyna się argument b, co prowadziło do błędów w czasie kompilacji. Postanowiono jawnie używać nazw argumentów dla takich parametrów.