用法 一
sealed abstract class Either[+A, +B] extends Product with Serializable
表示两种可能类型之一的值(不相交的联合)。Either
的实例是 scala.util.Left 或 scala.util.Right 的实例。
Either
的一个常见用途是作为scala.Option 的替代方法来处理可能的缺失值。在这种用法中,scala.None 被替换为可以包含有用信息的scala.util.Left。 scala.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
,则 map
和 flatMap
等操作会返回不变的 Left
值:
def doubled(i: Int) = i * 2
Right(42).map(doubled) // Right(84)
Left(42).map(doubled) // Left(42)
由于 Either
定义了方法 map
和 flatMap
,它也可以用于理解:
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
理解使用 map
和 flatMap
,因此必须推断表达式中使用的函数参数的类型。这些类型受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
相关用法
- Scala util.Using用法及代码示例
- Scala util.DynamicVariable用法及代码示例
- Scala util.Try用法及代码示例
- Scala unapplySeq()用法及代码示例
- Scala Tabulate.sliding用法及代码示例
- Scala ArrayBuffer.inits用法及代码示例
- Scala long.BitwiseOr用法及代码示例
- Scala StringBuilder.partitionMap用法及代码示例
- Scala List distinct()用法及代码示例
- Scala DefaultMap.sizeIs用法及代码示例
- Scala StrictOptimizedIterableOps.sliding用法及代码示例
- Scala Searching.SearchResult用法及代码示例
- Scala ::.collectFirst用法及代码示例
- Scala TreeSet diff()用法及代码示例
- Scala Char getClass()用法及代码示例
- Scala int.Min用法及代码示例
- Scala IntMap.groupMap用法及代码示例
- Scala Map3.mkString用法及代码示例
- Scala IterableOnceOps.flatMap用法及代码示例
- Scala IndexedSeqOps.lengthIs用法及代码示例
- Scala Map3.addString用法及代码示例
- Scala WrappedString.scanRight用法及代码示例
- Scala String compareToIgnoreCase()用法及代码示例
- Scala List drop()用法及代码示例
- Scala ofDouble.inits用法及代码示例
注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 util.Either。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。