获得任何一个的价值

Kev*_*ith 19 scala either

除了使用之外match,是否有类似于选项的方式来getOrElse实现Right或者Left值的实际内容?

scala> val x: Either[String,Int] = Right(5)
scala> val a: String = x match { 
                                case Right(x) => x.toString
                                case Left(x) => "left" 
                       }
a: String = 5
Run Code Online (Sandbox Code Playgroud)

Nic*_*udo 14

我不是特别喜欢Either,因此我对它并不十分熟悉,但我相信你正在寻找预测:either.left.getOrElse或者either.right.getOrElse.

请注意,投影也可用于理解.这是一个直接来自文档的示例:

def interactWithDB(x: Query): Either[Exception, Result] =
  try {
    Right(getResultFromDatabase(x))
  } catch {
    case ex => Left(ex)
  }

// this will only be executed if interactWithDB returns a Right
val report =
  for (r <- interactWithDB(someQuery).right) yield generateReport(r)
if (report.isRight)
  send(report)
else
  log("report not generated, reason was " + report.left.get)
Run Code Online (Sandbox Code Playgroud)

  • @Kevin这只是我个人的意见,但我发现有两种情况有用:返回失败或成功,或返回两种可能的结果之一.使用`Try`更好地服务于前者,而后者看起来像是草率的编程 - 我觉得如果我的方法可以返回`String`或`Date`,例如,它可以做一些重构. (8认同)
  • 你为什么不喜欢"要么"? (4认同)
  • 对于尝试,如果你的行为是错误的**但不例外怎么办?这还是Try的好候选人吗?也许它可能是例外,但我尝试编写代码而无需例外. (3认同)
  • 我认为在验证框架中返回成功或失败是有用的.然后,公共API将明确告诉您它可以返回哪种成功/失败,即使它们是自定义的有状态类,同时避免了对已检查异常的笨拙使用.我目前正在研究的一个例子是事件采购框架,它将根据一些验证调度事件.它可能是预期的事件类型,也可能是某种"无效事件" (2认同)
  • @Nicolas Rinaudo,@ Nicolas Rinaudo,如果你想告诉客户端函数可能会返回几种类型的错误,例如InvalidDataError和InetrnalError,你会怎么做?使用Either,您可以这样写:def方法(输入:Int):[[Option [InvalidDataError],Option [InternalError]),Int] - 该方法的客户端发现可能发生的错误,并处理它们如果他想.你会怎么做尝试? (2认同)

Kri*_*ala 13

萨科瑙多的关于呼吁答案getOrElse在任一leftright投影可能是最接近Option.getOrElse.

或者,你可以fold:

scala> val x: Either[String,Int] = Right(5)
x: Either[String,Int] = Right(5)

scala> val a: String = x.fold(l => "left", r => r.toString)
a: String = 5
Run Code Online (Sandbox Code Playgroud)

由于l上面没有使用折叠,你也可以写x.fold(_ => "left", r => r.toString)

编辑: 其实,你可以从字面上Option.getOrElse通过调用toOptionleftright的投影要么,例如,

scala> val o: Option[Int] = x.right.toOption
o: Option[Int] = Some(5)

scala> val a: String = o.map(_.toString).getOrElse("left")
a: String = 5
Run Code Online (Sandbox Code Playgroud)