是否有完整的Scala模式匹配可能性规范?
我无法修复以下代码:
something match {
case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => {
doSomething(e)
}
...
}
(它不在2.8.1中编译。)
答案 0 :(得分:4)
Chapter 8 of the Scala Language Spec? (pdf)
更具体地说,this answer可能会有所帮助,也就是说你应该能够做到这样的事情:
case e: Exception if e.isInstanceOf[UnauthorizedException] || (e.isInstanceOf[ServerApiException] && e.asInstanceOf[ServerApiException].statusCode == 401) => {
doSomething(e)
}
答案 1 :(得分:4)
我不确定我是否会以这种方式编写代码;它很难遵循(除了不以原始形式工作)。
我宁愿选择像
这样的东西def doSomething(e: Exception) = { /* whatever */ }
something match {
case sae: ServerApiException if (sae.statusCode == 401) => doSomething(sae)
case ue: UnauthorizedException => doSomething(ue)
}
避免重复代码。或者您可以使用选项:
(something match {
case sae: ServerApiException if (sae.statusCode == 401) => Some(sae)
case ue: UnauthorizedException => Some(ue)
case _ => None
}).foreach(e => /* do something */ )
如果您希望之后再编写该方法。但我认为第一种方式可能是最清晰的。
答案 2 :(得分:3)
最后,我在Scala语言规范(Scala语法摘要)的帮助下进行了管理:
something match {
case e: Exception if (e match {
case sae: ServerApiException if sae.statusCode == 401 => true
case _: UnauthorizedException => true
case _ => false
}) => {
doSomething(e)
}
...
}