scala - Scala 中可变长度参数列表的类型是什么?

标签 scala variadic-functions

假设我声明一个函数如下:

def test(args: String*) = args mkString

args 的类型是什么?

最佳答案

这称为可变数量的参数或简称为可变参数。它的静态类型是Seq[T],其中T代表T*。因为 Seq[T] 是一个接口(interface),所以不能用作实现,在本例中为 scala.collection.mutable.WrappedArray[T] 。要找出这些事情,使用 REPL 会很有用:

// static type
scala> def test(args: String*) = args
test: (args: String*)Seq[String]

// runtime type
scala> def test(args: String*) = args.getClass.getName
test: (args: String*)String

scala> test("")
res2: String = scala.collection.mutable.WrappedArray$ofRef

Varargs 通常与 _* 符号结合使用,这是编译器将 Seq[T] 的元素传递给函数的提示序列本身:

scala> def test[T](seq: T*) = seq
test: [T](seq: T*)Seq[T]

// result contains the sequence
scala> test(Seq(1,2,3))
res3: Seq[Seq[Int]] = WrappedArray(List(1, 2, 3))

// result contains elements of the sequence
scala> test(Seq(1,2,3): _*)
res4: Seq[Int] = List(1, 2, 3)

关于scala - Scala 中可变长度参数列表的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13205012/

相关文章:

c++ - 可变参数模板参数的模板类型数组

go - go 中是否有可能使用 "partially apply"可变参数函数?

list - 如何处理传递给 Racket 函数的可变数量的参数?

scala sbt-launch.jar - 同一个目录下的多个项目?

c - 获取函数参数类型

scala - 我们如何对数据框进行排名?

scala - 在 Spark 流作业中调用实用程序(外部)

c++ - 函数参数中的省略号是否使用与普通参数相同的调用布局

scala - xgboost Scala API `predictContrib` 是什么?

scala - 如何使用 Scala 将派生列添加到数据框