假设我正在 Scala 中编写一个函数,它返回一个返回码:SUCCESS, ERROR1, ERROR2, ...(注意与 不同scala.util.Either)
显然,我可以创建一个层次结构来表示返回代码,如下所示:
特征返回码 案例对象 Success 扩展 ReturnCode 案例对象 Error1 扩展 ReturnCode 案例对象 Error2 扩展 ReturnCode ...
现在我想知道 Scala 中是否有一个“标准”的惯用解决方案。
假设我正在 Scala 中编写一个函数,它返回一个返回码:SUCCESS, ERROR1, ERROR2, ...(注意与 不同scala.util.Either)
显然,我可以创建一个层次结构来表示返回代码,如下所示:
特征返回码 案例对象 Success 扩展 ReturnCode 案例对象 Error1 扩展 ReturnCode 案例对象 Error2 扩展 ReturnCode ...
现在我想知道 Scala 中是否有一个“标准”的惯用解决方案。
您可以使用Try, 作为Either. “left”值固定Throwable为右偏,这意味着 map/flatMap 等将仅在成功时执行,异常保持原样,就像 wirhSome和Nonefor一样Option。您可以Try.apply在块周围使用来捕获非致命异常并将结果包装在Try.
你可以使用sealed关键字。
sealed trait ReturnCode
case object Success extends ReturnCode
case object Error1 extends ReturnCode
case object Error2 extends ReturnCode
如果您忘记了一些代码,您会收到警告:
scala> def test(r: ReturnCode) = r match {
| case Success => "Success"
| case Error1 => "Error1"
| }
<console>:1: warning: match may not be exhaustive.
It would fail on the following input: Error2
def test(r: ReturnCode) = r match {