scala - 在 Scala 中将选项转换为任一

标签 scala type-conversion option either

假设我需要转换 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) }

是否可以转换 OptionEither这样不添加类型?
您建议如何转换 OptionEither ?

最佳答案

不,如果你这样做,你不能遗漏类型。
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/

相关文章:

scala - 如何检查 WeakTypeTag 或 Type 是否代表具体类型?

java - 如何从 Java 中的 Java 列表创建 scala.collection.immutable.Seq?

scala - 如何在 Scala 中实现 string.replaceAll 链

c# - 使用 Npgsql 和 Entity Framework 将 bool 属性存储为整数

java - 将子类对象存储为父类(super class)并稍后检索子类

html - 如何在 IE 中为选择选项设置 css 位置

rust - 为什么Option <T>::and_then()与后面的.unwrap_or()不互斥?

scala - Scala 中有没有办法从任何 Map 转换为 java.util.Map?

python - 从数据框中获取值(value)

scala - 光滑的左外连接获取整个连接行作为选项