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

Is there a full specification for pattern matching possibilities of Scala?

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

我无法修复以下代码:

1
2
3
4
5
6
  something match {
    case e @ (sae: ServerApiException if sae.statusCode == 401 | _: UnauthorizedException) => {
      doSomething(e)
    }
    ...
  }

(它不在2.8.1中编译。)


我不确定我会用这种方式编写代码;这很难理解(除了不以原始形式工作之外)。

我想买点像

1
2
3
4
5
def doSomething(e: Exception) = { /* whatever */ }
something match {
  case sae: ServerApiException if (sae.statusCode == 401) => doSomething(sae)
  case ue: UnauthorizedException => doSomething(ue)
}

以避免重复代码。或者您可以使用选项:

1
2
3
4
5
(something match {
  case sae: ServerApiException if (sae.statusCode == 401) => Some(sae)
  case ue: UnauthorizedException => Some(ue)
  case _ => None
}).foreach(e => /* do something */ )

如果你喜欢以后写这个方法。但我认为第一种方法可能是最清楚的。


scala语言规范第8章?(PDF)。

更具体地说,这个答案可能会有所帮助,也就是说,你应该能够做如下的事情:

1
2
3
case e: Exception if e.isInstanceOf[UnauthorizedException] || (e.isInstanceOf[ServerApiException] && e.asInstanceOf[ServerApiException].statusCode == 401) => {
    doSomething(e)
}


最后,我在scala语言规范(scala语法摘要)的帮助下进行了管理:

1
2
3
4
5
6
7
8
9
10
  something match {
    case e: Exception if (e match {
      case sae: ServerApiException if sae.statusCode == 401 => true
      case _: UnauthorizedException => true
      case _ => false
    }) => {
      doSomething(e)
    }
    ...
  }