第二个问题,避免 的匿名函数case
,是一个有争议的问题:
https://groups.google.com/d/msg/scala-debate/Q0CTZNOekWk/z1eg3dTkCXoJ
另外:http ://www.scala-lang.org/old/node/1260
对于第一个问题,选择是允许在箭头的 RHS 上使用块还是表达式。
在实践中,我发现较短的大小写主体通常更可取,因此我当然可以想象您的替代语法会产生更清晰的代码。
考虑单线方法。你写:
def f(x: Int) = 2 * x
那么你需要添加一个语句。我不知道 IDE 是否能够自动添加括号。
def f(x: Int) = { val res = 2*x ; res }
这似乎并不比要求案例主体使用相同的语法更糟糕。
回顾一下,case 子句是case Pattern Guard => body
.
目前,body
是一个块,或一个语句序列和一个结果表达式。
如果body
是表达式,则需要大括号用于多个语句,例如函数。
我认为不会=>
导致歧义,因为函数文字不符合模式的条件,不像1
or之类的文字"foo"
。
一个障碍可能是:{ case foo => ??? }
是“模式匹配匿名函数”(SLS 8.5)。显然,如果案例是可选的或消除的,那么{ foo => ??? }
是模棱两可的。您必须区分 anon funs 中的 case 子句(case
需要的地方)和 a 中的 case 子句match
。
对当前语法的一个反驳是,在从 C 派生的直觉中,您总是暗中希望您的匹配项能够编译为切换表。在那个比喻中,案例是要跳转到的标签,而标签只是一系列语句的地址。
替代语法可能会鼓励更内联的方法:
x match {
C => c(x)
D => d(x)
_ => ???
}
@inline def c(x: X) = ???
//etc
在这种形式下,它看起来更像是一个调度表,匹配体让人想起 Map 语法,Map(a -> 1, b -> 2)
即对关联的整洁简化。