有没有办法忽略不匹配的情况?

时间:2011-03-26 20:40:44

标签: scala

如果我有match表达式,如何让它自动忽略不匹配而不明确执行case _ =>?有没有办法创建一个像这样的函数呢?

3 个答案:

答案 0 :(得分:28)

你需要一种通用的方法来处理“忽略”。除其他类外,选项提供了这些(除其他外)。所以你可以:

val i = 7
Some(i) collect {
  case 3 => "Yay!"
  case 5 => "Boo!"
}

获取None(键入为Option[String])。所以基本上,如果您将x match更改为Some(x) collect,您将获得所需的功能。当人们对处理选项感到满意时,最好这样做。

答案 1 :(得分:11)

编写通用匹配器:

object Match {
    def default: PartialFunction[Any, Unit] = { case _ => }
    def apply[T](x: T)(body: PartialFunction[T, Unit]) = (body orElse default)(x)
}

示例:

scala> 1 to 5 foreach (Match(_) {
     |   case 2 => println("two")
     |   case 3 => println("three")
     | }
     | )
two
three

您可能对PartialFunction的伴侣对象的方法condcondOpt感兴趣。

答案 2 :(得分:2)

任何无法处理所有可能输入值的匹配块都会形成一个Partial Function,它绝对可以在Scala中定义和使用。

PartialFunctionFunction的子类,并添加了isDefinedAt方法,如果它与提供的值具有已定义的匹配项,则返回true。部分函数最适用于测试定义的位置,例如catch块或2.8集合API中的collect方法。否则,如果您尝试使用未定义为输入的值调用它,则会出现异常。