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

问题描述 投票:12回答:2

编译器如何解释这个?:

foo match {
  case bar: Bar => println("First case statement")
  case _ => 
}

第二种情况是空的,没有任何回报。

scala syntax
2个回答
16
投票

这意味着返回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,因为它是StringUnit之间的第一个常见超类型。

请注意,您的案例匹配是错误的,因为单独匹配bar意味着捕获所有变量,您可能想要bar: Bar


1
投票

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

没有为第二种情况指定代码的事实,因此如果该情况运行它什么都不做。

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

在案例类和模式匹配章节的Scala书中的Martin Odersky Programming中有关它的更多细节。

© www.soinside.com 2019 - 2024. All rights reserved.