Dla osób korzystających z Pythona:
_*
Operator Scali jest mniej więcej odpowiednikiem operatora * -operatora Pythona .
Przykład
Konwersja przykładu scala z linku dostarczonego przez Luigiego Plinge'a :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
do Pythona wyglądałoby następująco:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
i oba dają następujący wynik:
Co słychać
,
doktorze?
Różnica: rozpakowywanie parametrów pozycyjnych
Podczas gdy *
operator Pythona może również zajmować się rozpakowywaniem parametrów pozycyjnych / parametrów dla funkcji o stałej arity:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Robiąc to samo ze Scalą:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
zawiedzie:
za mało argumentów do pomnożenia metody: (x: Int, y: Int) Int.
Nieokreślony parametr wartości y.
Ale można osiągnąć to samo ze scalą:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
Według Lorrina Nelsona tak to działa:
Pierwsza część, f _, to składnia częściowo zastosowanej funkcji, w której żaden z argumentów nie został określony. Działa to jako mechanizm do przechwytywania obiektu funkcji. tupled zwraca nową funkcję o wartości arity-1, która przyjmuje jedną krotkę arity-n.
Dalsze czytanie:
def sum(xs: _*)
zgłasza błąd: niezwiązany typ wieloznaczny '