警卫(如果表达)
Case 语句可以与 if 表达式结合使用,以便在模式匹配时提供额外的逻辑。
def checkSign(x: Int): String = {
x match {
case a if a < 0 => s"$a is a negative number"
case b if b > 0 => s"$b is a positive number"
case c => s"$c neither positive nor negative"
}
}
确保你的警卫不会创建非详尽的匹配(编译器通常不会捕获此内容)非常重要:
def f(x: Option[Int]) = x match {
case Some(i) if i % 2 == 0 => doSomething(i)
case None => doSomethingIfNone
}
这会在奇数上抛出一个 MatchError
。你必须考虑所有情况,或使用通配符匹配案例:
def f(x: Option[Int]) = x match {
case Some(i) if i % 2 == 0 => doSomething(i)
case _ => doSomethingIfNoneOrOdd
}