Перехват MatchError при инициализации val с сопоставлением с образцом в Scala? - PullRequest
4 голосов
/ 18 января 2012

Каков наилучший способ (лаконичный, четкий, идиоматический) поймать MatchError при назначении значений с сопоставлением с образцом?

Пример:

val a :: b :: Nil = List(1,2,3) // throws scala.MatchError

Лучший способ, который я нашел до сих пор:

val a :: b :: Nil = try {
    val a1 :: b1 :: Nil = List(1,2,3)
    List(a1, b1)
  catch { case e:MatchError => // handle error here }

Есть ли идиоматический способ сделать это?

Ответы [ 4 ]

7 голосов
/ 18 января 2012

Почему бы не просто

val a::b::Nil = List(1,2,3) match {
  case a1::b1::Nil => {
    a1::b1::Nil
  }
  case _ => //handle error
}

6 голосов
/ 18 января 2012

Немного улучшается решение Ким:

val a :: b :: Nil = List(1, 2, 3) match {
  case x @ _ :: _ :: Nil => x
  case _ => //handle error
}

Если бы вы могли предоставить больше информации о том, как вы можете обработать ошибку, мы могли бы предоставить вам лучшее решение.

1 голос
/ 18 января 2012

Следующее не улавливает ошибку, но избегает (некоторые из них; см. Комментарий Николаса) ее. Не знаю, интересно ли это спрашивающему.

scala> val a :: b :: _ = List(1,2,3)
a: Int = 1
b: Int = 2
0 голосов
/ 23 июля 2014

Простое решение таково:

List(1, 2, 3) match {
   case a :: b :: Nil => .....
   case _ => // handle error
}

Я не люблю совпадать дважды, потому что это избыточно. "Val" с сопоставлением с образцом следует использовать только тогда, когда вы уверены, что он совпадает, или добавить блок try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...