Подтвердить что ты не робот

Получение ценности

Кроме использования match, существует ли способ, похожий на getOrElse, фактический контент значения Right или Left?

scala> val x: Either[String,Int] = Right(5)
scala> val a: String = x match { 
                                case Right(x) => x.toString
                                case Left(x) => "left" 
                       }
a: String = 5
4b9b3361

Ответ 1

Мне не особенно нравится Either, и в результате я не очень хорошо знаком с ним, но я считаю, что вы ищете прогнозы: either.left.getOrElse или either.right.getOrElse.

Обратите внимание, что проекции могут использоваться и для понятий. Это пример из документации:

def interactWithDB(x: Query): Either[Exception, Result] =
  try {
    Right(getResultFromDatabase(x))
  } catch {
    case ex => Left(ex)
  }

// this will only be executed if interactWithDB returns a Right
val report =
  for (r <- interactWithDB(someQuery).right) yield generateReport(r)
if (report.isRight)
  send(report)
else
  log("report not generated, reason was " + report.left.get)

Ответ 2

Ответ Николаса Ринаудо относительно вызова getOrElse на проекции left или right, вероятно, наиболее близок к Option.getOrElse.

В качестве альтернативы вы можете fold либо:

scala> val x: Either[String,Int] = Right(5)
x: Either[String,Int] = Right(5)

scala> val a: String = x.fold(l => "left", r => r.toString)
a: String = 5

Поскольку l не используется в вышеуказанной складке, вы также можете написать x.fold(_ => "left", r => r.toString)

Edit: Фактически, вы можете буквально иметь Option.getOrElse, вызывая toOption на проекции left или right либо, например,

scala> val o: Option[Int] = x.right.toOption
o: Option[Int] = Some(5)

scala> val a: String = o.map(_.toString).getOrElse("left")
a: String = 5

Ответ 3

В Scala 2.12 существует метод getOrElse для получения "правильного" значения, но вы не можете использовать его для "левого" значения напрямую. Однако вы можете сделать это следующим образом: e.swap.getOrElse(42).