Получение ценности
Кроме использования 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
Ответы
Ответ 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)
.