当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。