Scala реализует встроенный метод черт - PullRequest
0 голосов
/ 01 июля 2018

Я начал изучать scala и игровые рамки. Я скачал пример проекта с сайта Play Framework. У меня вопрос новичка, потому что я не могу понять следующий синтаксис:

def count = Action { Ok(counter.nextCount().toString) }

Что именно это делает? Action реализована функция в BaseController, где назначается построитель действий. Какое содержание готовит Бетвен? Что означают фигурные скобки в этом контексте?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

В playframework запросы обрабатываются Actions. Когда вы вызываете Action { ... }, вы фактически вызываете play.api.mvc.Action вспомогательный объект для создания Action значений.

object Action extends ActionBuilder[Request] { ... } 

Если вы присмотритесь к Action объекту, он распространяется на play.api.mvc.ActionBuilder черту Эта черта содержит различные overloaded apply методы, которые создают Action значения. Поэтому, когда вы вызываете Action{ ... }, вы фактически вызываете Action.apply({...}), и этот метод apply наследуется от черты ActionBuilder. Если вы посмотрите на черту ActionBuilder, вы увидите различные функции высшего порядка apply.

Теперь в вашем случае, def count = Action { Ok(counter.nextCount().toString) }

Вы на самом деле вызываете метод apply с содержимым по умолчанию и без параметра запроса.

final def apply(block: => Result): Action[AnyContent] = apply(_ => block)

Это означает, что вы предоставляете блок { Ok(counter.nextCount().toString) }, который возвращает Ok Результат.

Какое содержание готовит Бетвен? Что означают фигурные скобки в этом контексте?

Когда вы делаете Action { Ok(counter.nextCount().toString) }, вы фактически вызываете:

Action.apply(Ok(counter.nextCount().toString))

В scala метод apply является фабричным методом, и поэтому вам не нужно по существу вызывать метод apply, поэтому вы также можете выполнить Action(Ok(counter.nextCount().toString)). Кроме того, если ваша функция принимает только один параметр, вы можете заменить () скобки на фигурные скобки {}. то есть вы можете сделать Action{Ok(counter.nextCount().toString)}.

Я бы посоветовал взглянуть на функциональные литералы, функции более высокого порядка, параметр по имени, метод каррирования и т. Д. Так, чтобы вы имели более полное представление об этом.

0 голосов
/ 01 июля 2018

Исходный код даст вам подробную информацию:

/**
   * Constructs an `Action` with default content, and no request parameter.
   *
   * For example:
   * {{{
   * val hello = Action {
   *   Ok("Hello!")
   * }
   * }}}
   *
   * @param block the action code
   * @return an action
   */
  final def apply(block: => Result): Action[AnyContent] =
    apply(BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))(_ => block)

Это эквивалентно def count = Action.apply(Ok(counter.nextCount().toString))

...