5

タイプTまたはタイプエラーのいずれかを返す一種のオプションタイプをアーカイブするにはどうすればよいですか?

いくつかのWebリクエストを実行していますが、応答が「ok」でオブジェクトが含まれているか、呼び出しでエラーが返されます。その場合、エラーの理由をErrorオブジェクトに提供します。

だから次のようなもの:

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

1 に答える 1

14

scala.Either

Eitherタイプはまさにあなたが望むものでなければなりません:

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

Eitherに似てOptionいますが、2 つの可能な値のうちの 1 つを保持できます: leftまたはright。慣例により、は OK で、はエラーです。

派手なパターン マッチングを実行できるようになりました。

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 usingtoRight() rather thantoLeft()` から:

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

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

ただし、この単純な例ではEither、結果として直接返す方が簡単に見えます。myRequest()

于 2012-05-28T13:00:59.480 に答える