在
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)函数,用于处理请求并生成要发送到客户端的结果。”
那么,行动到底是什么?功能还是特质?
答案 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
trait EssentialAction extends (RequestHeader) => Accumulator[...]
我们在其中看到extends (RequestHeader) => Accumulator
语法。请注意,A => B
是Function1
特质的语法糖,所以我们可以写
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 + "]")
}