Для людей 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 : _*)
потерпит неудачу:
недостаточно аргументов для умножения метода: (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.
Дальнейшее чтение: