假设我需要转换 Option[Int]
至 Either[String, Int]
在斯卡拉。我想这样做:
def foo(ox: Option[Int]): Either[String, Int] =
ox.fold(Left("No number")) {x => Right(x)}
不幸的是,上面的代码无法编译,我需要添加类型
Either[String, Int]
明确地:ox.fold(Left("No number"): Either[String, Int]) { x => Right(x) }
是否可以转换
Option
至 Either
这样不添加类型?您建议如何转换
Option
至 Either
?
最佳答案
不,如果你这样做,你不能遗漏类型。Left("No number")
的类型推断为 Either[String, Nothing]
.仅来自 Left("No number")
编译器无法知道您想要 Either
的第二种类型成为 Int
,并且类型推断还没有到编译器会查看整个方法并决定它应该是 Either[String, Int]
的程度。 .
您可以通过多种不同的方式来做到这一点。例如模式匹配:
def foo(ox: Option[Int]): Either[String, Int] = ox match {
case Some(x) => Right(x)
case None => Left("No number")
}
或使用
if
表达:def foo(ox: Option[Int]): Either[String, Int] =
if (ox.isDefined) Right(ox.get) else Left("No number")
或与
Either.cond
:def foo(ox: Option[Int]): Either[String, Int] =
Either.cond(ox.isDefined, ox.get, "No number")
关于scala - 在 Scala 中将选项转换为任一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706443/