为了采用类似的 Scala 语法,模式匹配案例中的守卫不需要在其条件表达式周围加上括号——例如,以下内容:
case i if i % 2 == 0 => i / 2
和这个一样有效:
case i if (i % 2 == 0) => i / 2
坚持 C 系列风格意味着需要后一种形式,即使括号对于消除歧义不是必需的。Scala 语言设计者决定在这种情况下减少线路噪声胜过保持家族相似性。
我猜想类似的动机也在match
语法中起作用,在我看来match (expr) { ... }
,与expr match { ... }
.
另外,就在今天下午,我重构了其他人的x match { ... }
toOption
代替x map { ... }
。match
作为中缀运算符使这两个表达式之间的相似性变得清晰。
关于为什么match
不只是一种方法的问题,这里是大卫波拉克在邮件列表中提出的一个五年前的scala-debate
问题:
为什么“匹配”是语言级别的构造而不是 Any 上的方法?
马丁·奥德斯基的回答:
在 Scala 1 中曾经是这样的。我不再确定我们为什么要改变。语法高亮?错误报告?没有把握。不过,我认为这两种方式都不重要。
我和马丁在这件事上。
请注意,存在一些实际差异(除了简单的“点与否”问题)。例如,这不会编译:
def foo[A, B](f: PartialFunction[A, B])(a: A) = a match f
如果match
仍然是 on 的一个方法Any
,那么需要一堆字面上的案例将是一个相当奇怪的要求。