Сопоставление с логикой ИЛИ - PullRequest
0 голосов
/ 28 июня 2018

Например, у меня есть два Try объекта. Я хочу получить сообщение об ошибке, если тот или иной отказывает, и обработать его таким же образом:

  val t1 = Try(throw new Exception("one"))
  val t2 = Try(throw new Exception("two"))

  (t1, t2) match {
    case (Success(_), Success(_)) => println("It's ok")
    case _ : Failure(e), _) | (_, Failure(e) =>  // Compile error here

      println("Fail", e)                         // Doesn't matter from where e was come 
  }

Возможно ли скомпилировать этот код с одинаковым e в обоих вариантах сбоя?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Другой удобный способ, основанный на ответе @ Nyavro , - объединить несколько попыток за одну попытку с помощью comprhensions:

 val tryDoIt = for {
   t1 <- Try(throw new Exception("one"))
   t2 <- Try(throw new Exception("two"))
   t3 <- Try(throw new Exception("three"))
 } yield (t1, t2, t3)

 tryDoIt match {
   case Success((x, y, z)) => println(x,y,z)
   case Failure(e) => println(e.getMessage)
 }
0 голосов
/ 28 июня 2018

Вы не можете комбинировать шаблоны совпадений таким образом. Вы можете достичь желаемого поведения следующим образом:

t1.flatMap(_ => t2) match {
   case Success(_) => println("It's ok")
   case Failure(e) => prinltn("Fail", e)
}
...