我对Scala 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:_*)
^
答案 0 :(得分:8)
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) = ()
^