scala:return语句的问题

ope*_*sas 13 scala playframework-2.0

这有点让我感到困惑

以下代码编译好了:

def save: Action[AnyContent] = Action {
  if (1 == 2) {
    BadRequest(toJson("something went wrong"))
  } else {
    Ok(toJson(Feature.find))
  }
}
Run Code Online (Sandbox Code Playgroud)

但如果我只是添加return语句,我得到以下内容:

def save: Action[AnyContent] = Action {
  if (1 == 2) {
    return BadRequest(toJson("something went wrong"))
  } else {
    return Ok(toJson(Feature.find))
  }
}

[error]  found   : play.api.mvc.SimpleResult[play.api.libs.json.JsValue] 
[error]  required: play.api.mvc.Action[play.api.mvc.AnyContent]
[error]       return BadRequest(toJson("something went wrong"))
Run Code Online (Sandbox Code Playgroud)

我以为这两个代码是等价的......

BTW,Action是一个伴随对象,它有一个apply方法,它接收一个形式的函数:Request [AnyContent] => Result,并返回一个Action [AnyContent]

看起来像return语句,块返回直接执行BadRequest的结果...而且Ok ...而不是返回将块传递给Action对象伴侣的结果...

我对吗?

注意:我正试图找到摆脱这么多嵌套map和getOrElse的方法

ps:对不起,如果问题有点混乱,我很困惑自己......

Dan*_*ral 11

这两个表达确实做了很多不同的事情!

def save: Action[AnyContent] = Action {
  if (1 == 2) {
    BadRequest(toJson("something went wrong"))
  } else {
    Ok(toJson(Feature.find))
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,save将返回结果Action(Ok(toJson(Feature.find))).现在,

def save: Action[AnyContent] = Action {
  if (1 == 2) {
    return BadRequest(toJson("something went wrong"))
  } else {
    return Ok(toJson(Feature.find))
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的情况更复杂.什么时候return Ok(toJson(Feature.find))评估,它将从save!也就是说,Ok(toJson(Feature.find))不会被传递到Action.相反,该方法的执行save将停止并将Ok(toJson(Feature.find))作为其结果返回 - 除了这不是该类型save应该返回,因此它给出了类型错误.

记住:return从封闭中返回def.

  • @opensas你总是可以将你的函数定义为`def`,然后将它作为参数传递给`Action`. (2认同)