真正的动作是什么?

wan*_*kai 3 scala playframework

val echo = Action { request =>
  Ok("Got request [" + request + "]")
}
Run Code Online (Sandbox Code Playgroud)

看来Action是一个函数,只有一个函数类型参数,它的类型是Request [A] => Result

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

它告诉我Action是一个特质:

trait Action[A] extends EssentialAction
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*lic 7

在Scala中,确实使用特征定义了一个函数,例如

object foo extends (Int => String) {
  def apply(i: Int): String = s"hello $i"
}
Run Code Online (Sandbox Code Playgroud)

要么

val foo: Int => String = i => s"hello $i"
Run Code Online (Sandbox Code Playgroud)

要么

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

所有定义一个函数我们可以调用foo(42),这desugars来foo.apply(42)

一个动作是

trait Action[A] extends EssentialAction
Run Code Online (Sandbox Code Playgroud)

这里EssentialAction

trait EssentialAction extends (RequestHeader) => Accumulator[...]
Run Code Online (Sandbox Code Playgroud)

我们在这里看到extends (RequestHeader) => Accumulator语法。注意这A => BFunction1特质的语法糖,所以我们可以写

trait EssentialAction extends Function1[RequestHeader, Accumulator[...]]`
Run Code Online (Sandbox Code Playgroud)

现在,Action特征还具有一个Action伴随对象,该对象带有一个函数参数block并构造一个Action带有默认请求正文的:

Action.apply(block: (Request[AnyContent]) => Result): Action[AnyContent]
Run Code Online (Sandbox Code Playgroud)

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

Action { request =>
  Ok("Got request [" + request + "]")
}
Run Code Online (Sandbox Code Playgroud)