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

Scala 为什么在arity-1方法调用中需要大括号?,scala,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

当我编写类似于
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>vala=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(大小写((a,b,c)=>(a,b,c))
:1:错误:简单表达式的开始非法
a、 map(case((a,b,c)=>(a,b,c))
请注意,与上面的命令相比,上一个命令中删除了支架


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

因为没有大括号,您只是创建了
函数的一个实例n
,但是使用大括号,您创建了
PartialFunction
的一个实例,它允许您将
case
与解构子句一起使用

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

val f: PartialFunction[Int, Any] = { case _ => 1/0 }
请注意,此行为目前被视为不需要的,将在Dotty中修复。有了Dotty,您的功能将变成:

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

有关这方面的更多信息,请查看

中的幻灯片37是的,多蒂将非常棒。很快!