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語句來處理錯誤條件,它就會中斷,因爲代碼不再輸入檢查。我在這裏做錯了什麼?
爲什麼沒有必要包裹'Ok'和' NoContent'子句子句? –
因爲'Right'的情況已經是'Future',並且你正在調用'map'(在這兩種情況下檢查'x'的類型)。 – dwickern
如果在業務邏輯中有意義,您可能想要返回Future [要麼是[String,Option [Foo]]],這對我來說似乎更自然,而且調用者更容易處理 – kosii