是否有完整的Scala模式匹配可能性规范?

时间:2011-07-08 12:31:20

标签: scala pattern-matching

是否有完整的Scala模式匹配可能性规范?

我无法修复以下代码:

  something match {
    case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => {
      doSomething(e)
    }
    ...
  }

(它不在2.8.1中编译。)

3 个答案:

答案 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)
    }
    ...
  }