Синтаксис сахара: _ * для лечения Seq как параметры метода
Я просто заметил эту конструкцию где-то в Интернете:
val list = List(someCollection: _*)
Что означает _*
? Является ли это синтаксическим сахаром для вызова метода? Какими ограничениями должен удовлетворять мой пользовательский класс, чтобы он мог использовать этот синтаксический сахар?
Ответы
Ответ 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 для взрыва массива. Некоторые функции принимают переменное количество аргументов и передают в массив, который вам нужно добавить : _*
к аргументу массива.
Ответ 3
Я экстрасенс, я предсказываю, что вы увидите этот шаблон в scala:
http://www.slideshare.net/normation/scala-dreaded
Ответ 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