编译器如何解释这个?:
foo match {
case bar: Bar => println("First case statement")
case _ =>
}
第二种情况是空的,没有任何回报。
这意味着返回Unit
:
val res: Unit = new foo match {
case bar: Bar => println("First case statement")
case _ =>
}
如果你改变你的语句而不是println
(返回Unit
)的东西:
val res: Any = new foo match {
case bar: Bar => "it's a bar"
case _ =>
}
现在编译器已经推断出Any
,因为它是String
和Unit
之间的第一个常见超类型。
请注意,您的案例匹配是错误的,因为单独匹配bar
意味着捕获所有变量,您可能想要bar: Bar
。
在模式匹配示例中,空的默认情况是必需的,因为否则匹配表达式会为每个不是条形的expr参数抛出MatchError。
没有为第二种情况指定代码的事实,因此如果该情况运行它什么都不做。
任何一种情况的结果都是Unit value(),因此也是整个匹配表达式的结果。
在案例类和模式匹配章节的Scala书中的Martin Odersky Programming中有关它的更多细节。