我在斯卡拉区非常新手,最近,我想各地的玩法,玩的框架。 我以前玩控制台生成我的第一个应用程序。
后来,我读的代码,但在下面的代码片段,我就弄糊涂了。
package controllers
import play.api._
import play.api.mvc._
object Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
}
在文档方面,行动是一个同伴对象,但什么是下大括号的语法同伴的对象,是像Java中的匿名实现接口的,或大括号里面的内容就是应用方法的重写?
请指点,非常感谢。 对不起,斯卡拉老兵这个幼稚和简单的问题。
这句法糖Action.apply
。 (你不能有一个匿名的实施的object
,但你可以,如果这是一个trait
,它也将需要new
)。 它有几个重载:
final def apply[A](bodyParser: BodyParser[A])(block: R[A] => Result): Action[A]
final def apply(block: R[AnyContent] => Result): Action[AnyContent]
final def apply(block: => Result): Action[AnyContent]
您的代码段使用最后的三个。 顺便说一句,他们都返回实施对象Action[A]
特质。
动作是扩展EssentialAction性状
trait Action[A] extends EssentialAction
必要行动也不过是一个function.Given RequestHeader,一个EssentialAction消耗请求主体(数组[字节]),并返回一个结果。
trait EssentialAction extends (RequestHeader) ⇒ Iteratee[Array[Byte], Result] with Handler
ActionBuilder是一个辅助特征,它拥有一些方法来构建行动。 正是这种特质包含多个重载异步和施工方法。 如果要定义自定义操作(或)在组成一个acction到其他(或)其他后执行一个动作,你就必须使用这个特性并建立自己的行动。
trait ActionBuilder[+R[_]] extends ActionFunction[Request, R]
但是,是什么样的行动{...}语法。 性状ActionBuilder有伴侣的对象也具有相同的名称行动。 请注意,这是从列车操作[A]不同。 该目的将覆盖InvokeBlock方法。 在Scala中,你可以定义对象为好。 你定义一个对象,并提供一个适用的方法,当你调用对象,它被调用。
object Action extends ActionBuilder[Request] {companion
def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = block(request)
}
你有过在大括号{...}什么是什么,但定义为invokeBlock参数块。 在Scala中您可以使用括号或大括号将参数传递给函数,括号工作得很好,当你有一个多表情像块。 这invokeBlock方法从重载版本在ActionBuilder特质申请的调用。
我明白了,这是一个有点铺天盖地关于云大括号里面的东西取整点,觉得很容易,我花了10天左右要弄清楚这一点。 欢迎到斯卡拉!
资源:
源代码- https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/scala/play/api/mvc/Action.scala
稀疏文件- https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition
玩API文档- https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.mvc.ActionBuilder
行动组成优秀的博客- http://www.mariussoutier.com/blog/2013/09/17/playframework-2-2-action-building-action-composition/