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)函数。”
那么行动到底是什么?功能还是特质?
在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)
trait EssentialAction extends (RequestHeader) => Accumulator[...]
Run Code Online (Sandbox Code Playgroud)
我们在这里看到extends (RequestHeader) => Accumulator语法。注意这A => B是Function1特质的语法糖,所以我们可以写
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)