如何在Scala中以惯用方式重写此代码?

Mic*_*ael 0 scala exception-handling optional

假设我有一个f: Int => String可能抛出异常的函数.我想写一个函数tryF(f: Int => String, arg: Int, defaultOpt: Option[String]),其工作原理如下:

  • f(arg)如果没有抛出异常,则调用并返回结果
  • 如果调用因异常而失败defaultOpt.isDefined然后返回defaultOpt.get
  • 否则抛出异常

我写的如下:

def tryF(f: Int => String, arg: Int, defaultOpt: Option[String]) = {
  val r = scala.util.Try(f(arg))
  r.toOption orElse defaultOpt getOrElse r.get
}
Run Code Online (Sandbox Code Playgroud)

是否有意义 ?你会改写它吗?

vpt*_*ron 5

你的解决方案很好,即使我个人觉得它不太可读.我会做那样的事情:

def tryF[A](f: =>A, defaultOpt: Option[A]): A = (Try(f), defaultOpt) match {
  case (Success(result), _)          => result
  case (Failure(_), Some(defValue))  => defValue
  case (Failure(t), None)            => throw t
}
Run Code Online (Sandbox Code Playgroud)

请注意,它是不必要的冗长(我可以在某些情况下使用通配符)但我认为您的用例值得一些自我记录代码.很容易理解每​​种情况的触发因素.