programowanieProgramista Kotlin

Jak działa 'vararg' w Kotlin? Opisz zasady przekazywania, ograniczenia, interakcje z popularnymi wzorcami oraz typowe trudności przy łączeniu z argumentami nazwanymi i zwykłymi.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

  • Zwykła składnia: fun foo(vararg numbers: Int)
  • Argument z vararg musi być ostatnim wśród parametrów funkcji (jeśli po nim są parametry, to muszą być nazwane przy wywołaniu).
  • Można przekazywać zarówno pojedyncze wartości, jak i tablicę (używając operatora spread *).
  • Funkcję z vararg można wywołać bez przekazywania wartości tego argumentu.

Przykład kodu

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ę)

Pytanie z pułapką.

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

Przykłady rzeczywistych błędów z powodu nieznajomości szczegółów tematu.


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.