在Scala中有一个'空'case语句是什么意思?

Cor*_*ped 14 syntax scala

编译器如何解释这个?:

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.


eli*_*sah 6

在模式匹配示例中,空默认情况是必要的,因为否则匹配表达式将为每个不是条形的 expr 参数抛出 MatchError。

事实上,没有为第二种情况指定代码,因此如果该情况运行,它不会执行任何操作。

任一情况的结果都是 Unit value (),因此它也是整个匹配表达式的结果。

有关更多详细信息,请参阅 Martin Odersky 的《Scala 编程》一书中的“案例类和模式匹配”一章。