Scala中的多选项类型

时间:2012-05-28 12:47:43

标签: scala

如何归档一种Option类型,它返回类型为T或类型为Error的东西?

我正在做一些Web请求,响应是“ok”并且包含对象或者调用返回错误,在这种情况下我想提供一个错误原因的Error对象。

类似于:

def myRequest() : Result[MyObject] {
  if (thereWasAnError) Error(reason) else MyObject 
}

1 个答案:

答案 0 :(得分:14)

scala.Either

Either类型应该是您想要的:

def myRequest() : Either[String, MyObject] = 
    if (thereWasAnError) 
        Left("Some error message") 
    else 
        Right(new MyObject)

EitherOption类似,但可以保留两个可能值中的一个: left right 。按照惯例, right 是正常的,而 left 是一个错误。

您现在可以进行一些奇特的模式匹配:

myRequest() match {
    case Right(myObject) =>
        //...
    case Left(errorMsg) =>
        //...
}

scala.Option.toRight()

类似地,您可以使用Option并将其翻译为Either。因为通常*right* values is used for success and left for failure, I suggest using toRight()rather than toLeft()`:

def myRequest() : Option[MyObject] =
    if (thereWasAnError)
        None
    else
        Some(new MyObject)

val result: Either[String, MyObject] = myRequest() toRight "Some error message"

但是,在这个简单的示例中,Either直接返回myRequest()似乎更直接。