13

我对此有点困惑

以下代码编译正常:

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

但如果我只是添加 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"))

我认为这两个代码将是等效的...

顺便说一句,Action 是一个伴随对象,具有一个接收以下形式的函数的 apply 方法:Request[AnyContent] => Result,并返回一个 Action[AnyContent]

似乎使用 return 语句,该块正在返回直接执行 BadRequest... 和 Ok... 的结果,而不是返回将块传递给 Action 对象伴侣的结果...

我对吗?

注意:我正在尝试找到一种摆脱这么多嵌套地图和 getOrElse 的方法

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

4

2 回答 2

11

这两个表达式确实做了非常不同的事情!

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

在这里,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))
  }
}

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

记住:return从封闭返回def

于 2012-08-13T15:42:51.880 回答
4

您使用的方法确实在Action伴随对象中定义,但它不是您在问题中描述的方法,而是:

def apply (block: ⇒ Result): Action[AnyContent]

参数 ( block) 是类型结果的表达式,稍后将根据需要对其进行评估(按名称评估)。它不是函数或闭包,只是一个表达式。所以你不能return从一个表达式。

顺便说一句:return在 Scala 中使用是一种代码味道,应该避免。

于 2012-08-13T07:09:57.490 回答