真正的动作是什么?

时间:2019-06-27 03:09:05

标签: scala playframework

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

似乎Action是一个函数,有一个函数类型参数,它的类型是Request [A] =>结果

在文档中:https://www.playframework.com/documentation/2.7.x/api/scala/play/api/mvc/Action.html

它告诉我动作是一种特质:

trait Action[A] extends EssentialAction

“动作本质上是一个(Request [A] => Result)函数,用于处理请求并生成要发送到客户端的结果。”

那么,行动到底是什么?功能还是特质?

1 个答案:

答案 0 :(得分:7)

在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 => BFunction1特质的语法糖,所以我们可以写

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

现在,Action特质也有一个Action companion object,它带有一个函数参数block并构造一个带有默认请求正文的Action

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

这实际上是我们写作时使用的

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