Scala: проблемы с оператором return
Я немного озадачен этим
Следующий код компилируется нормально:
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"))
Я думал, что эти два кода будут эквивалентны...
BTW, Action является сопутствующим объектом с методом apply, который получает функцию формы: Request [AnyContent] = > Результат и возвращает действие [AnyContent]
Кажется, что с помощью оператора return блок возвращает результат непосредственного выполнения BadRequest... и Ok... вместо того, чтобы возвращать результат передачи блока сопутствующему объекту Action...
Я прав?
Примечание. Я пытаюсь найти способ избавиться от так много вложенных карт и getOrElse
ps: извините, если вопрос немного запутан, я смутил себя...
Ответы
Ответ 1
Эти два выражения действительно очень разные вещи!
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
.
Ответ 2
Используемый вами метод действительно определен в объекте Action
companion, но это не тот, который вы описываете в своем вопросе, а скорее:
def apply (block: ⇒ Result): Action[AnyContent]
Аргумент (block
) является выражением результата типа, который будет оцениваться позже по требованию (оценка по имени). Это не функция или закрытие, просто выражение. Поэтому вы не можете return
из выражения.
BTW: Использование return
в Scala является запахом кода, и его следует избегать.