编译器如何解释这个?:
foo match {
case bar: Bar => println("First case statement")
case _ =>
}
Run Code Online (Sandbox Code Playgroud)
第二种情况是空的,没有任何回报.
End*_*Neu 19
这意味着回归Unit:
val res: Unit = new foo match {
case bar: Bar => println("First case statement")
case _ =>
}
Run Code Online (Sandbox Code Playgroud)
如果您更改语句而不是println返回(返回Unit):
val res: Any = new foo match {
case bar: Bar => "it's a bar"
case _ =>
}
Run Code Online (Sandbox Code Playgroud)
现在编译器已推断,Any因为它是String和之间的第一个常见超类型Unit.
请注意,您的大小写匹配是错误的,因为bar单独匹配意味着捕获您可能想要的所有变量bar: Bar.
在模式匹配示例中,空的默认情况是必要的,因为否则匹配表达式将为每个不是条形的 expr 参数抛出 MatchError。
事实上,没有为第二种情况指定代码,因此如果该情况运行,它不会执行任何操作。
任一情况的结果都是 Unit value (),因此它也是整个匹配表达式的结果。
有关更多详细信息,请参阅 Martin Odersky 的《Scala 编程》一书中的“案例类和模式匹配”一章。