最近我发现自己编写了一个通用实用程序,将Option
转换为scala.util.Try
,如下所示:
implicit class OptionTry[A](oa: Option[A]) extends AnyVal {
def asTry[E <: Exception](e: E): Try[A] = oa match {
case Some(a) => Success(a)
case None => Failure(e)
}
def asTry(msg: String): Try[A] = asTry(new Exception(msg))
}
现在我想知道为什么标准库没有提供它。我错过了什么吗?
答案 0 :(得分:4)
正如克里斯·马丁已经暗示过,区别在于语义。
对None
- 类型来说,Option
并不例外,这是预期的行为。
因此,从Option
转换为Try
可以被视为一种特殊行为,其中没有标准方法来表达适合所有用户的内容。提示可能是您需要在转换器函数中给出预期的Exception。
一个合适的解决方案可能是改变返回Option
的实现而不是使用Try
,而不是之后添加行为。 (如果这是可能的,而不是隐式类的整个原因;))
答案 1 :(得分:3)
这个问题可能是偏离主题的,因为除了意见或猜测之外我没有其他答案,但这是我的推测。
引入了 Try
以提供try
- catch
语法的替代方法。 Scala世界中的例外情况有点令人不悦,Try
可以帮助您处理抛出的API,而不是鼓励您使用异常。
在Either
可能比Try
更合适的情况下,您似乎正在使用此功能。例如,我建议o.asTry("xyz")
建议Try[A]
而不是写o.toRight("xyz")
来获取Either[String, A]
。