Что такое действие в действительности? - PullRequest
3 голосов
/ 27 июня 2019

В

val echo = Action { request =>
  Ok("Got request [" + request + "]")
}

Кажется, что Action - это функция, у которой есть один параметр типа функции, это тип Request [A] => Result

В документе: https://www.playframework.com/documentation/2.7.x/api/scala/play/api/mvc/Action.html

Это говорит мне, что Действие - это черта:

trait Action[A] extends EssentialAction

"Действие - это, по сути, функция (Request [A] => Result), которая обрабатывает запрос и генерирует результат для отправки клиенту."

Так что же такое Действие? функция или черта?

1 Ответ

7 голосов
/ 27 июня 2019

В Scala функция действительно определяется с использованием черты, например,

object foo extends (Int => String) {
  def apply(i: Int): String = s"hello $i"
}

или

val foo: Int => String = i => s"hello $i"

или

val foo = new Function1[Int, String] {
  override def apply(i: Int): String = s"hello $i"
}

все определяют функциюмы можем позвонить с помощью foo(42), что приводит к foo.apply(42).

Действие

trait Action[A] extends EssentialAction

, где EssentialAction равно

trait EssentialAction extends (RequestHeader) => Accumulator[...]

где мы видим синтаксис extends (RequestHeader) => Accumulator.Обратите внимание, что A => B является синтаксическим сахаром для признака Function1, поэтому мы можем написать

trait EssentialAction extends Function1[RequestHeader, Accumulator[...]]`

Теперь черта Action также имеет объект-компаньон Action, который принимает аргумент функции block и создает Action с телом запроса по умолчанию:

Action.apply(block: (Request[AnyContent]) => Result): Action[AnyContent]

, и это фактически то, что используется, когда мы пишем

Action { request =>
  Ok("Got request [" + request + "]")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...