解释varargs的Scala语法

时间:2010-11-30 16:13:27

标签: scala syntax variadic-functions

  

可能重复:
  Syntax sugar: _*

我编写了一个函数,它传递了一个格式字符串(对于String.format(...))和一个varargs参数数组(以及其他内容)。该方法如下所示:

def myMethod(foo: Number, formatStr: String, params: Any*): Unit = {
  // .. some stuff with foo
  println(formatStr, params.map(_.asInstanceOf[AnyRef]) : _*)
}

我得到了params参数here的语法。有用!但是怎么样?我不理解println的第二个参数的语法,特别是结尾部分(: _*)。它显然是在调用map并将数组扩展为AnyRef s。

的序列

2 个答案:

答案 0 :(得分:16)

通常,:表示法用于类型归属,强制编译器将值视为某种特定类型。这与完全相同与投射相同。

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

在这种情况下,您将归因于特殊的 varargs 类型_*。这反映了用于声明varargs参数的星号表示法,可用于子类Seq[T]的任何类型的变量:

def myMethod(params: Any*) = ... //varargs parameter, use as an Array[Any]

val list = Seq("a", 42, 3.14) //a Seq[Any]
myMethod(list : _*)

答案 1 :(得分:7)

结尾部分: _*将集合转换为vararg参数。

我知道这看起来很奇怪。