Scala 中递归可变参数函数的语法

Syntax of recursive variadic function in Scala

我正在学习 Scala,刚刚遇到可变参数函数。在我写的下面的例子中几乎一切正常:

object Sscce {

  def main(args: Array[String]) {
    printStrings("Hello", "Scala", "here", "I", "am");
  }

  def printStrings(ss: String*): Unit = {
    if (!ss.isEmpty) {
      println(ss.head)
      printStrings(ss.tail: _*)
    }
  }

}

我理解 String* 表示字符串的变量列表,并且 ss 映射到 Seq 类型。我还假设 Seq 不能传递给可变参数函数,因此在 printStrings 的递归调用中必须用 ss 完成一些事情。

问题是:: _*的确切含义是什么?这对我来说似乎有点像演员表(因为有 : 符号)

它被称为序列参数(参见section 6.6 Function Applications of the Scala Language Specification中的倒数第二段)。

它故意类似于参数列表中的 Type Ascription syntax. In an argument list, it basically means the exact opposite of what Repeated Parameters 意思。重复参数表示 "take all the leftover arguments and collect them into a single Seq",而序列参数表示 "take this single Seq and pass its elements as individual arguments".