当我编写像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编译器不能在没有括号括号的情况下推断出匿名函数?
答案 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