假设我在Scala中编写一个函数,它返回一个返回代码:SUCCESS
,ERROR1
,ERROR2
,...(注意是与scala.util.Either
)
显然,我可以创建一个层次结构来表示返回代码,如下所示:
trait ReturnCode case object Success extends ReturnCode case object Error1 extends ReturnCode case object Error2 extends ReturnCode ...
现在我想知道Scala中是否存在“标准”的惯用解决方案。
答案 0 :(得分:3)
您可以使用Try
作为Either
的替代方案。 “左”值固定为Throwable
,它是右偏的,这意味着map / flatMap等只会在成功时执行,异常会保持原样,就像wirh {{1}一样}和Some
None
。您可以在块周围使用Option
来捕获非致命异常,并将结果包装在Try.apply
中。
答案 1 :(得分: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 {