Ven*_*ama 4 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("")
Run Code Online (Sandbox Code Playgroud)
DNA*_*DNA 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
Run Code Online (Sandbox Code Playgroud)
更新:单个参数列表中的多个varargs会产生语法问题 - 编译器如何知道给定参数属于哪个参数(一个参数列表在哪里结束,下一个开始,特别是如果它们是兼容类型?) .
从理论上讲,如果语言的语法被修改,以便人们可以区分第一个和第二个参数列表(没有currying),那么就没有理由不能在JVM级别工作,因为varargs无论如何都只是被编译成一个数组.
但我非常怀疑这是一个足够普遍的案例来证明进一步使语言复杂化,特别是当解决方案已经存在时.
另请参阅此相关的Java问题和答案.
Scala 基于 Java 虚拟机,它设置为仅接受可变参数作为最后一个参数,每个方法参数集仅接受一个可变参数。没有办法解决这个问题,这就是编译器的工作原理。
为了正确地看待它,想象一个像这样的方法签名:
someMethod(strings1: String*, strings2: String*)
Run Code Online (Sandbox Code Playgroud)
假设您在调用它时传递了 4 个单独的字符串。编译器不知道哪个 String 对象属于哪个 vararg。
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |