如果我有match
表达式,如何让它自动忽略不匹配而不明确执行case _ =>
?有没有办法创建一个像这样的函数呢?
答案 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
的伴侣对象的方法cond
和condOpt
感兴趣。
答案 2 :(得分:2)
任何无法处理所有可能输入值的匹配块都会形成一个Partial Function,它绝对可以在Scala中定义和使用。
PartialFunction
是Function
的子类,并添加了isDefinedAt
方法,如果它与提供的值具有已定义的匹配项,则返回true。部分函数最适用于测试定义的位置,例如catch块或2.8集合API中的collect
方法。否则,如果您尝试使用未定义为输入的值调用它,则会出现异常。