Для людей з Python:
_*
Оператор Scala більш-менш еквівалентний * -оператору Python .
Приклад
Перетворення прикладу шкали за посиланням, наданим Луїджі Плінге :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
для Python буде виглядати так:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
і обидва дають такий результат:
Що
там
док?
Різниця: розпакування позиційних параметрів
Хоча Python *
-operator може також мати справу з розпаковуванням позиційних параметрів / параметрів для функцій з фіксованою сутністю:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Подібні дії з Scala:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
не вдасться:
недостатньо аргументів для методу множення: (x: Int, y: Int) Int.
Невизначений параметр значення y.
Але цього можна досягти і за допомогою Scala:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
За словами Лорріна Нельсона , це працює так:
Перша частина, f _, є синтаксисом частково застосованої функції, в якій не вказано жодного з аргументів. Це працює як механізм отримання затримки об'єкта функції. tupled повертає нову функцію arity-1, яка приймає один кортеж arity-n.
Далі читання:
def sum(xs: _*)