播放 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))
}
就个人而言,我会使用 map
和 getOrElse
:
重写
def addGroup = Action { implicit request =>
GetUserFromSession(request) map { user =>
Redirect(routes.ApplicationUser.show(user.id))
} getOrElse {
Redirect(routes.ApplicationUser.show(0))
}
}
它消除了使用 .get
的需要并且还优先考虑正分支。
我知道这不是 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))
}
就个人而言,我会使用 map
和 getOrElse
:
def addGroup = Action { implicit request =>
GetUserFromSession(request) map { user =>
Redirect(routes.ApplicationUser.show(user.id))
} getOrElse {
Redirect(routes.ApplicationUser.show(0))
}
}
它消除了使用 .get
的需要并且还优先考虑正分支。