剧中的动作到底是什么?

What play's Action really is?

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

"An action is essentially a (Request[A] => Result) function that handles a request and generates a result to be sent to the client."

那么 Action 到底是什么?一个功能,还是一个特征?

在Scala中,函数确实是使用trait来定义的,例如

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 trait 也有一个 Action companion object,它接受一个函数参数 block 并构造一个 Action 和默认请求主体:

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

这实际上就是我们写

时使用的
Action { request =>
  Ok("Got request [" + request + "]")
}