Поскольку я новичок в Scala (2.9.1), у меня есть List[Event]
и я хотел бы скопировать его в Queue[Event]
, но следующий синтаксис Queue[List[Event]]
вместо этого дает :
val eventQueue = Queue(events)
Почему-то работает следующее:
val eventQueue = Queue(events : _*)
Но хотелось бы понять, что он делает и почему работает? Я уже смотрел сигнатуру Queue.apply
функции:
def apply[A](elems: A*)
И я понимаю, почему первая попытка не работает, но в чем смысл второй? Что есть :
, и _*
в данном случае, и почему apply
функция просто не принимает Iterable[A]
?
def sum(xs: _*)
выдает 'error: unbound wildcard type'xs: int
означает, что тип xs - int, в соответствии с этим синтаксис в scala вышеxs: _*
означает, что xs передается его отдельным членам.def sum(args: Int*)
и вы называете его с подстановочным типа «видового» вара-арг:val a = sum(xs: _*)
. Подумайте об этом_*
так: «Я передаю Int *, String * или что-нибудь *, что определено в сигнатуре метода»Для людей 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)
То же самое со Scala:
def multiply(x:Int, y:Int) = { x * y; } val operands = (2, 4) multiply (operands : _*)
не удастся:
Но с помощью scala можно добиться того же:
def multiply(x:Int, y:Int) = { x*y; } val operands = (2, 4) multiply _ tupled operands
По словам Лоррина Нельсона, это работает так:
Дальнейшее чтение:
источник