剧中的动作到底是什么?
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 => B
是 Function1
特征的语法糖,因此我们可以写成
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 + "]")
}
在
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 => B
是 Function1
特征的语法糖,因此我们可以写成
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 + "]")
}