Scala:为什么方法不能有多个vararg参数?

时间:2015-05-08 21:48:50

标签: scala variadic-functions

有谁能告诉我为什么存在这种限制?它与JVM或Scala编译器有关吗?

$ scala
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def toText(ints: Int*, strings: String*) = ints.mkString("") + strings.mkString("")
<console>:7: error: *-parameter must come last
       def toText(ints: Int*, strings: String*) = ints.mkString("") + strings.mkString("")

2 个答案:

答案 0 :(得分:12)

如果您使用多个参数列表( curried 语法),Scala 中的方法可以有多个varargs:

scala> def toText(ints: Int*)(strings: String*) = 
         ints.mkString("") + strings.mkString("")

scala> toText(1,2,3)("a", "b")

res0: String = 123ab

更新:单个参数列表中的多个变量会产生语法问题 - 编译器如何知道给定参数属于哪个参数(一个参数列表在哪里结束,下一个开始,特别是如果它们是相容的类型?)。

理论上,如果语言的语法被修改,以便可以区分第一个和第二个参数列表(没有currying),那么没有理由这在JVM级别上不起作用,因为varargs只是被编译成一个阵列无论如何。

但我非常怀疑这是一个足够普遍的案例来证明语言的复杂性,尤其是当解决方案已经存在时。

另请参阅this related Java questionanswer

答案 1 :(得分:4)

Scala基于Java虚拟机,它被设置为仅接受varargs作为最后一个参数,每个方法参数设置只接受一个。没有解决这个问题,这就是编译器的工作原理。

为了正确看待它,想象一下像这样的方法签名:

someMethod(strings1: String*, strings2: String*)

让我们说你在调用时传递4个单独的字符串。编译器不知道哪个String对象属于哪个vararg。