为什么在arity-1方法调用中需要大括号括号?

时间:2017-01-03 22:47:47

标签: scala

当我编写像foo.map(case Foobar(x,y) => something)这样的代码时,我收到了一个错误。后来我发现我必须用括号括起来包装匿名函数(case Foobar(x,y) => something)。以下是scala REPL的演示:

scala> val a = List(((1, 2),3), ((4,5),6))
a: List[((Int, Int), Int)] = List(((1,2),3), ((4,5),6))

scala> a.map({case ((a,b),c) => (a,b,c)})
res0: List[(Int, Int, Int)] = List((1,2,3), (4,5,6))

scala> a.map(case ((a,b),c) => (a,b,c))
<console>:1: error: illegal start of simple expression
a.map(case ((a,b),c) => (a,b,c))

请注意,与上面的命令相比,最后一个命令中删除了括号括号。

那么,这种行为的原因是什么?为什么scala编译器不能在没有括号括号的情况下推断出匿名函数?

1 个答案:

答案 0 :(得分:5)

因为没有大括号,你只是创建FunctionN的实例,但是使用花括号,你创建的PartialFunction实例允许你使用case解构条款。

您可以查看PartialFunction here的文档,其中显示了一个非常简单的示例:

val f: PartialFunction[Int, Any] = { case _ => 1/0 }

请注意,此行为目前被视为不受欢迎,并将在Dotty中修复。有了Dotty你的功能就会变成这样:

a.map(((a,b),c) => (a,b,c))

有关详细信息,请查看this presentation.

中的幻灯片37