Синтаксис sugar: _ * для обработки Seq как параметров метода - PullRequest
46 голосов
/ 14 ноября 2010

Я только что заметил эту конструкцию где-то в сети:

val list = List(someCollection: _*)

Что означает _*?Это синтаксический сахар для вызова некоторых методов?Каким ограничениям должен удовлетворять мой пользовательский класс, чтобы он мог воспользоваться этим синтаксическим сахаром?

Ответы [ 3 ]

69 голосов
/ 14 ноября 2010

Обычно обозначение : используется для определения типа, заставляя компилятор видеть значение как некоторый конкретный тип.Это не совсем то же самое, что и приведение.

val b = 1 : Byte
val f = 1 : Float
val d = 1 : Double

В этом случае вы приписываете специальный тип varargs .Это отражает обозначение звездочки, используемое для объявления параметра varargs, и может использоваться для переменной любого типа, которая подклассов Seq[T]:

def f(args: String*) = ... //varargs parameter, use as an Array[String]
val list = List("a", "b", "c")
f(list : _*)
17 голосов
/ 14 ноября 2010

Это синтаксис scala для взрыва массива. Некоторые функции принимают переменное число аргументов и для передачи в массив вам нужно добавить : _* к аргументу массива.

1 голос
/ 07 января 2019

Переменная (количество) Аргументы определяются с помощью *. Например,

def wordcount(words: String*) = println(words.size)

wordcount ожидает строку в качестве параметра,

scala> wordcount("I")
1

, но принимает больше строк в качестве входного параметра (_ * требуется для типа Ascription)

scala> val wordList = List("I", "love", "Scala")
scala> wordcount(wordList: _*)
3
...