Для людей Python:
_*
Оператор Scala более или менее эквивалентен * -оператору Python .
пример
Преобразование примера scala из ссылки, предоставленной Луиджи Плиндж :
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 также может распаковывать позиционные параметры / параметры для функций с фиксированной арностью:
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 : _*)
не удастся:
недостаточно аргументов для метода multiply: (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: _*)
выдает 'error: unbound wildcard type'