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
私は特にEither
が好きではないので、あまり詳しくありませんが、予測を探していると思います:either.left.getOrElse
またはeither.right.getOrElse
。
射影はfor内包でも使用できることに注意してください。これはドキュメンテーションからの直接の例です:
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)
getOrElse
またはleft
プロジェクションでright
を呼び出すことに関するNicolas Rinaudoの回答は、おそらく_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)
と書くこともできます
編集:実際には、どちらかのtoOption
またはleft
プロジェクションでright
を呼び出すことにより、文字通り_Option.getOrElse
_を使用できます。たとえば、
_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
_
両側にA
が指定されている、つまりEither[A, A]
、使用できます Either.merge
...左か右かに関係なく、どちらかのインスタンスから値を抽出します。
左と右の型が異なる場合、結果はAny
になります:
val e: Either[Int, String] = Right("hello")
e.merge // hello: Any
Scala 2.12では、「右」の値を取得するためのgetOrElse
メソッドがありますが、「左」の値に直接使用することはできません。ただし、次のように行うことができます。 : e.swap.getOrElse(42)
。