27

除了使用 之外match,是否有类似 Option 的方式来处理or值getOrElse的实际内容?RightLeft

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
4

4 回答 4

18

Nicolas Rinaudo 关于调用或投影的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)

编辑: 实际上,您可以Option.getOrElse通过调用toOption其中一个的leftorright投影来实现,例如,

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
于 2013-10-21T23:01:47.790 回答
18

我不是特别喜欢Either,因此我对它不是很熟悉,但我相信你正在寻找预测:either.left.getOrElseeither.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)
于 2013-10-21T20:08:35.023 回答
3

给定A两边的类型,即Either[A, A],我们可以使用Either.merge

...从 Either 实例中提取值,无论它们是 Left 还是 Right。

请注意,如果左右类型不同,则结果是两种类型中的最小上限,在最坏的情况下可能变为Any

val e: Either[Int, String] = Right("hello")
e.merge // hello: Any
于 2018-07-01T12:51:41.377 回答
1

在 Scala 2.12 中有一种getOrElse获取“右”值的方法,但您不能直接将它用于“左”值。但是,您可以这样做:e.swap.getOrElse(42).

于 2017-09-12T16:48:11.430 回答