0

假设我正在 Scala 中编写一个函数,它返回一个返回码SUCCESS, ERROR1, ERROR2, ...(注意与 不同scala.util.Either

显然,我可以创建一个层次结构来表示返回代码,如下所示:

特征返回码
案例对象 Success 扩展 ReturnCode
案例对象 Error1 扩展 ReturnCode
案例对象 Error2 扩展 ReturnCode
...

现在我想知道 Scala 中是否有一个“标准”的惯用解决方案。

4

2 回答 2

3

您可以使用Try, 作为Either. “left”值固定Throwable为右偏,这意味着 map/flatMap 等将仅在成功时执行,异常保持原样,就像 wirhSomeNonefor一样Option。您可以Try.apply在块周围使用来捕获非致命异常并将结果包装在Try.

于 2013-05-11T10:23:27.140 回答
2

你可以使用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 {
于 2013-05-11T10:20:21.853 回答