为什么这不起作用?
val f = (args: Int*) => args.sum
error: ')' expected but identifier found.
val f = (args: Int*) => args.sum
^
但是这很好用
def sum(args: Int*) = args.sum
val f = sum _
这个也是
val f: (Int*) => Int = args => args.sum
顺便说一句。我正在使用 scala 2.9.1
我不是规范阅读方面的专家,但看起来匿名函数不支持可变参数语法。
中函数声明与匿名函数的语法ParamType ::= Type
| ‘=>’ Type
| Type ‘*’
Binding ::= (id | ‘_’) [‘:’ Type]
虽然我不知道这是什么原因。似乎有原因,但没有一个可以轻易解释。 Martin Odersky 评论了为匿名函数添加 varargs 的请求:“乍一看这看起来很诱人,但它会带来很多复杂性(你只需要相信我这一点)。”
Lex Spoon 对此也有很好的解释这里
这里的语法有点误导;也许是太可爱了。可变参数的 Any* 语法使它看起来像 Any* 本身就是一种类型。实际上,* 是方法参数上的注释,而不是类型上的注释。
当您使用 T1=>T2 语法写下函数类型时,T1 和 T2 都需要是普通的旧类型。 Scala 提供了多种类型,但可变参数类型不是其中之一。
在实际代码中,出路是显式使用序列类型。事实上,如果你查看 good2 的推断类型,你会发现它涉及 Seq[Any] 而不是 Any*。