Есть ли полная спецификация возможностей сопоставления с образцом в Scala? - PullRequest
4 голосов
/ 08 июля 2011

Существует ли полная спецификация возможностей сопоставления с образцом в Scala?

Я не могу исправить следующий код:

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

(не компилируется в 2.8.1.)

Ответы [ 3 ]

4 голосов
/ 08 июля 2011

Я не уверен, что написал бы код таким образом; это трудно следовать (в дополнение к не работает в своем первоначальном виде). ​​

Я бы предпочел что-то вроде

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 */ )

если вы предпочитаете писать метод позже. Но я думаю, что первый способ, вероятно, самый ясный.

4 голосов
/ 08 июля 2011

Глава 8 спецификации языка Scala? (PDF) .

Конкретнее, этот ответ может оказать некоторую помощь, то есть вы должны быть в состоянии сделать что-то вроде:

case e: Exception if e.isInstanceOf[UnauthorizedException] || (e.isInstanceOf[ServerApiException] && e.asInstanceOf[ServerApiException].statusCode == 401) => {
    doSomething(e)
}
3 голосов
/ 08 июля 2011

Наконец, мне удалось это с помощью Scala Language Spec (Синтаксис Scala):

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