播放 Framework/Scala: "return" 声明在行动?

Play Framework/Scala: "return" statement in Action?

我知道这不是 Scala 的写法。我认为,在 Scala 中你会使用地图。但我想这样写,因为它更像Java/c++。 但是,编写以下代码时,Scala 编译器会抱怨 "method addGroup has return statement; needs result type"。 省略 return 并使用 else 分支。但是出于格式原因,我想使用 return,因为我不想缩进其余代码,如果您使用 "else {}".

就会出现这种情况

在哪里添加结果类型。 "Future[Result]" 是正确的类型吗?

def addGroup = Action { implicit request =>
  val optionUser = GetUserFromSession(request)
  if (optionUser == None) {
    return Redirect(routes.ApplicationUser.show(0))
  }
  Redirect(routes.ApplicationUser.show(optionUser.get.id))
}

你不能。 Action.apply 的主体是一个匿名函数,您正试图从中过早 return。问题是,Scala returns 中的 return 关键字来自最内部的 named 方法,这肯定不是。所以你会尝试 return a Result 其中方法需要 Action[A].

唯一可行的方法是拆分功能:

def addGroup = Action { implicit request =>
  result(request)
}

// Could have a better name, but whatever, you shouldn't do this.
def result(request: Request): Result = {
  val optionUser = GetUserFromSession(request)
  if (optionUser == None) {
    return Redirect(routes.ApplicationUser.show(0))
  }
  Redirect(routes.ApplicationUser.show(optionUser.get.id))
}

使用 return 会使代码变得奇怪且难以阅读,所以请不要使用。

如果保存单个缩进确实是个问题,那么这个呢?

def addGroup = Action { implicit request =>
  val optionUser = GetUserFromSession(request)
  if (optionUser == None) Redirect(routes.ApplicationUser.show(0))
  else Redirect(routes.ApplicationUser.show(optionUser.get.id))
}

就个人而言,我会使用 mapgetOrElse:

重写
def addGroup = Action { implicit request =>
  GetUserFromSession(request) map { user =>
     Redirect(routes.ApplicationUser.show(user.id))
  } getOrElse {
     Redirect(routes.ApplicationUser.show(0))
  }     
}

它消除了使用 .get 的需要并且还优先考虑正分支。