W Pythonie mamy operator gwiazdki (lub "*" lub "rozpakuj"), który pozwala nam rozpakować listę w celu wygodnego użycia w przekazywaniu argumentów pozycyjnych. Na przykład:Czy istnieje odpowiednik Scala dla rozpakowywania listy Pythona (a.k.a. "*")?
range(3, 6)
args = [3, 6]
# invokes range(3, 6)
range(*args)
W tym konkretnym przykładzie, nie zaoszczędzić dużo pisać, ponieważ range
trwa tylko dwa argumenty. Ale możesz sobie wyobrazić, że gdyby było więcej argumentów dla range
, lub gdyby args
został odczytany ze źródła wejściowego, zwrócony z innej funkcji itp., To może się przydać.
W Scali nie udało mi się znaleźć odpowiednika. Rozważmy następujące polecenia uruchamiane w sesji interaktywnej Scala:
case class ThreeValues(one: String, two: String, three: String)
//works fine
val x = ThreeValues("1","2","3")
val argList = List("one","two","three")
//also works
val y = ThreeValues(argList(0), argList(1), argList(2))
//doesn't work, obviously
val z = ThreeValues(*argList)
Czy jest bardziej zwięzły sposób to zrobić oprócz metody stosowanej w val y
?
Błędnie oznaczono jako duplikat, a nie jest. Scala ma operację ': _ *', ale działa tylko z varargs po stronie definicji: np. 'case class Things (xs: String *)' –