Scala播放控制器中的模式匹配

Scala播放控制器中的模式匹配,scala,playframework,Scala,Playframework,我有一个玩具函数,定义如下: case class Foo (a : Int, b : String) def get(): Either[String, Future[Option[Foo]]] = { Right(Future.successful(Some(Foo(1, "ABS")))) } 在Scala播放控制器中,我尝试对该函数调用的结果进行模式匹配: def hello() : Action[AnyContent] = Action.async { implicit r

我有一个玩具函数,定义如下:

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

def get(): Either[String, Future[Option[Foo]]] = {
  Right(Future.successful(Some(Foo(1, "ABS"))))
}
在Scala播放控制器中,我尝试对该函数调用的结果进行模式匹配:

  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语句。如果我省略它,那么所有类型都会检查。但是,只要我添加Left case语句来处理错误条件,它就会中断,因为代码不再进行类型检查。我做错了什么?

您没有从左侧案例返回
未来
,并且您的
InternalServerError
不会自动包装,因此您必须这样做:

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

您没有从左侧案例返回
Future
,并且您的
InternalServerError
不会自动包装,因此您必须这样做:

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

为什么不必包装
Ok
NoContent
case子句?因为
Right
case已经是
Future
了,您正在调用
map
(在这两种情况下检查
x
的类型)。您可能想要返回Future[String,Option[Foo]]如果这在您的业务逻辑中是有意义的,那么对我来说似乎更自然,也更容易被调用方处理为什么不需要包装
Ok
NoContent
case子句?因为
Right
case已经是
未来的
并且您正在调用
map
(在这两种情况下检查
x
的类型)。您可能希望返回Future[String,Option[Foo]],如果这在您的业务逻辑中是合理的,那么对我来说更自然,调用方也更容易处理