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".
我正在学习 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".