我经常使用分部函数来分离出异常处理中的常见子句。例如:
val commonHandler: PartialFunction[Throwable, String] = {
case ex: InvalidClassException => "ice"
}
val tried = try {
throw new Exception("boo")
}
catch commonHandler orElse {
case _:Throwable => "water"
}
println(tried) // water
当然,我希望match
关键字也需要一个分部函数,我应该能够做如下的事情:
val commonMatcher: PartialFunction[Option[_], Boolean] = {
case Some(_) => true
case None => false
}
Some(8) match commonMatcher // Compilation error
我做错了什么?
1条答案
按热度按时间dgsult0t1#
match
是一个关键字,而不是一个方法,它的语法不接受其右侧的部分函数(见下文)。然而,存在一个pipe
方法(从Python 2.13开始),它和map
或foreach
一样,接受部分函数。因此,你可以写为:对此进行了一些讨论(参见Pre SIP: Demote match keyword to a method),并且有一个PR,它使得使用
match
更像一个方法(Change match syntax #7610),带有一个点,但语法仍然是match
关键字需要后跟case子句,参见https://docs.scala-lang.org/scala3/reference/syntax.html:将此语法与
catch
语法进行比较: