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



谁能告诉我为什么存在此限制?它与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("")

如果使用多个参数列表( curried andtax),则 can中的一个方法具有多个varargs:

scala> def toText(ints: Int*)(strings: String*) = 
         ints.mkString("") + strings.mkString("")
scala> toText(1,2,3)("a", "b")
res0: String = 123ab

update :单个参数列表中的多个varargs将创建语法问题 - 编译器如何知道给定参数属于哪个参数(一个参数列表结束,下一个开始开始,特别是如果它们是兼容类型的?)。

从理论上讲,如果对语言的语法进行了修改,以便可以区分第一个和第二个参数列表(不遵守),则没有理由在JVM级别上行不通,因为Varargs只是将其编译成一个无论如何数组。

,但我非常怀疑这是一个足够常见的案例,可以使语言进一步复杂化,尤其是当解决方案已经存在时。

另请参阅此相关的Java问答。

scala基于Java虚拟机,该机器仅接受Varargs作为最后一个参数,每个方法参数设置只有一个。无效,这就是编译器的工作方式。

要透视它,想象一下这样的方法签名:

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

假设您在调用它时通过4个单独的字符串。编译器不知道哪个字符串对象属于哪个vararg。

相关内容

最新更新