當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Scala util.Either用法及代碼示例


用法 一

sealed abstract class Either[+A, +B] extends Product with Serializable

表示兩種可能類型之一的值(不相交的聯合)。Either 的實例是 scala.util.Leftscala.util.Right 的實例。

Either 的一個常見用途是作為scala.Option 的替代方法來處理可能的缺失值。在這種用法中,scala.None 被替換為可以包含有用信息的scala.util.Leftscala.util.Right 代替 scala.Some 。約定規定Left 用於失敗,Right 用於成功。

例如,您可以使用 Either[String, Int] 來指示接收到的輸入是 String 還是 Int

import scala.io.StdIn._
val in = readLine("Type Either a string or an Int: ")
val result: Either[String,Int] =
  try Right(in.toInt)
  catch {
    case e: NumberFormatException => Left(in)
  }

result match {
  case Right(x) => s"You passed me the Int: $x, which I will increment. $x + 1 = ${x+1}"
  case Left(x)  => s"You passed me the String: $x"
}

Either 是 right-biased,這意味著假設 Right 是要操作的默認情況。如果是 Left ,則 mapflatMap 等操作會返回不變的 Left 值:

def doubled(i: Int) = i * 2
Right(42).map(doubled) // Right(84)
Left(42).map(doubled)  // Left(42)

由於 Either 定義了方法 mapflatMap ,它也可以用於理解:

val right1 = Right(1)   : Right[Double, Int]
val right2 = Right(2)
val right3 = Right(3)
val left23 = Left(23.0) : Left[Double, Int]
val left42 = Left(42.0)

for {
  x <- right1
  y <- right2
  z <- right3
} yield x + y + z // Right(6)

for {
  x <- right1
  y <- right2
  z <- left23
} yield x + y + z // Left(23.0)

for {
  x <- right1
  y <- left23
  z <- right2
} yield x + y + z // Left(23.0)

// Guard expressions are not supported:
for {
  i <- right1
  if i > 0
} yield i
// error: value withFilter is not a member of Right[Double,Int]

// Similarly, refutable patterns are not supported:
for (x: Int <- right1) yield x
// error: value withFilter is not a member of Right[Double,Int]

由於 for 理解使用 mapflatMap ,因此必須推斷表達式中使用的函數參數的類型。這些類型受Either 值的約束。特別是,由於 right-biasing,Left 值可能需要類型參數 B 的顯式類型參數,即正確的值。否則,可能會被推斷為 Nothing

for {
  x <- left23
  y <- right1
  z <- left42  // type at this position: Either[Double, Nothing]
} yield x + y + z
//            ^
// error: ambiguous reference to overloaded definition,
// both method + in class Int of type (x: Char)Int
// and  method + in class Int of type (x: Byte)Int
// match argument types (Nothing)

for (x <- right2 ; y <- left23) yield x + y  // Left(23.0)
for (x <- right2 ; y <- left42) yield x + y  // error

for {
  x <- right1
  y <- left42  // type at this position: Either[Double, Nothing]
  z <- left23
} yield x + y + z
// Left(42.0), but unexpectedly a `Either[Double,String]`

伴生:

object

源碼:

Either.scala

用法 二

object Either

伴生:

class

源碼:

Either.scala

相關用法


注:本文由純淨天空篩選整理自scala-lang.org大神的英文原創作品 util.Either。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。