Подтвердить что ты не робот

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: извините, если вопрос немного запутан, я смутил себя...

4b9b3361

Ответ 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 является запахом кода, и его следует избегать.