2015-12-17 48 views
0

我有一個玩具函數定義如下:模式匹配播放控制器

case class Foo (a : Int, b : String) 

def get(): Either[String, Future[Option[Foo]]] = { 
    Right(Future.successful(Some(Foo(1, "ABS")))) 
} 

在Scala的播放控制器,I嘗試模式匹配對這個函數調用的結果:

def hello() : Action[AnyContent] = Action.async { implicit request => 
    get() match { 
     case Right(x) => x.map{ 
     case foo => Ok(Json.toJson(foo)) 
     case None => NoContent 
     } 
     case Left(x) => InternalServerError(x) 
    } 
    } 

問題是最後一個左邊的case語句。如果我忽略它,那麼所有類型都會檢查。但只要我添加左邊的case語句來處理錯誤條件,它就會中斷,因爲代碼不再輸入檢查。我在這裏做錯了什麼?

回答

3

你是不是從你的左邊的情況下返回Future,和你InternalServerError不會被自動換行,所以你需要做的是這樣的:

case Left(x) => Future.successful(InternalServerError(x)) 
+0

爲什麼沒有必要包裹'Ok'和' NoContent'子句子句? –

+1

因爲'Right'的情況已經是'Future',並且你正在調用'map'(在這兩種情況下檢查'x'的類型)。 – dwickern

+0

如果在業務邏輯中有意義,您可能想要返回Future [要麼是[String,Option [Foo]]],這對我來說似乎更自然,而且調用者更容易處理 – kosii