Подтвердить что ты не робот

Синтаксис сахара: _ * для лечения Seq как параметры метода

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

val list = List(someCollection: _*)

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

4b9b3361

Ответ 1

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

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 : _*)

Ответ 2

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

Ответ 4

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

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

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

scala> wordcount("I")
1

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

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