gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:21:49 25 4
gpt4 key购买 nike

我在编写类似 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 编译器不能推断出没有大括号的匿名函数?

最佳答案

因为没有大括号,您只是创建了一个 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|

关于scala - 为什么在 arity-1 方法调用中需要大括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41453574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com