Атрибут типа Scala для varargs, использующих _* причиной ошибки
У меня есть элементарное понимание Scara varargs: параметры метода, принимающего varargs, должны указывать на то, что это varargs, использующий _*
, Используя Scala 2.10.3, я определяю следующие два метода
scala> def method(varargs:Int*)(more:String*) = println(varargs,more)
method: (varargs: Int*)(more: String*)Unit
scala> val method2 = method(1,2,3)_
method2: Seq[String] => Unit =
Вызов их напрямую с использованием List или Range работает нормально
scala> val paramList = List("hi","ho")
paramList: List[java.lang.String] = List(hi, ho)
scala> method2(paramList)
(WrappedArray(1, 2, 3),List(hi, ho))
scala> val range = (1 to 5) map {_.toString}
range: scala.collection.immutable.IndexedSeq[String] = Vector(1, 2, 3, 4, 5)
scala> method2(range)
(WrappedArray(1, 2, 3),Vector(1, 2, 3, 4, 5))
Почему, когда я вызываю их, приписывая параметр _*
Я получаю ошибки?
scala> method2(paramList:_*)
<console>:11: error: type mismatch;
found : List[String]
required: Seq[Seq[String]]
method2(paramList:_*)
^
scala> method2(range:_*)
<console>:11: error: type mismatch;
found : scala.collection.immutable.IndexedSeq[String]
required: Seq[Seq[String]]
method2(range:_*)
^
1 ответ
method2
это не метод, принимающий повторяющиеся параметры, это функция с одним параметром типа Seq[String]
,
Вы должны назвать это так: method2(paramList)
без :_*
,
Там нет такого понятия, как function accepting repeated parameters
в scala 2.10
, но он существует в scala 2.9
:
scala> def method(varargs:Int*)(more:String*) = println(varargs,more)
method: (varargs: Int*)(more: String*)Unit
scala> val method2 = method(1,2,3)_
method2: String* => Unit = <function1>
scala> val paramList = List("hi","ho")
paramList: List[java.lang.String] = List(hi, ho)
scala> method2(paramList:_*)
(WrappedArray(1, 2, 3),List(hi, ho))
Обратите внимание на предполагаемый тип method2
: Seq[String] => Unit
в 2.10
против String* => Unit
в 2.9
,
Это не было полезной функцией: вы не можете использовать переменную типа String* => Unit
в качестве параметра или возвращаемого значения. На самом деле String* => Unit
не является допустимым типом даже в 2.9
:
scala> def test(f: String* => Unit) = ()
<console>:1: error: ')' expected but '=>' found.
def test(f: String* => Unit) = ()
^