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"))

この2つのコードは同等だと思いました...

ところで、Action はコンパニオン オブジェクトであり、Request[AnyContent] => Result という形式の関数を受け取る apply メソッドを持ち、Action[AnyContent] を返します。

return ステートメントのように見えますが、ブロックは、アクション オブジェクトのコンパニオンにブロックを渡した結果を返すのではなく、BadRequest を直接実行した結果を返しています... および Ok...

私は正しいですか?

注: 非常に多くのネストされたマップと getOrElse を取り除く方法を見つけようとしています。

ps:質問が少し混乱している場合は申し訳ありません。私は混乱しています...

4

2 に答える 2

11

これら 2 つの式は、まったく異なることを行います。

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))には渡されませんAction。代わりに、メソッドの実行saveが停止Ok(toJson(Feature.find))し、結果として返されますが、これはsave返されるはずの型ではないため、型エラーが発生します。

覚えておいてください:return囲んでいる から戻りますdef

于 2012-08-13T15:42:51.880 に答える
4

使用するメソッドは実際にコンパニオン オブジェクトで定義されていActionますが、質問で説明したものではなく、次のようになります。

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

引数 ( block) は結果型の式で、後で必要に応じて評価されます (名前による評価)。関数やクロージャーではなく、単なる式です。したがって、式からはできませんreturn

ところで: returnScala での使用はコードのにおいがするため、避ける必要があります。

于 2012-08-13T07:09:57.490 に答える