我已经开始学习scala和play框架。我从播放框架网站下载了示例项目。我有一个新手问题,因为我无法理解以下语法:
def count = Action { Ok(counter.nextCount().toString) }
它到底是做什么的? Action
是在BaseController中实现的功能,已在其中分配了操作生成器。
beetwen大括号的内容是什么?大括号在这种情况下意味着什么?
答案 0 :(得分:2)
在播放框架中,请求由Actions
处理。调用Action { ... }
时,实际上是在调用play.api.mvc.Action
帮助对象来创建Action
值。
object Action extends ActionBuilder[Request] { ... }
如果您仔细观察Action
对象,它会扩展到play.api.mvc.ActionBuilder
特征。此特征包含各种创建overloaded
值的apply
Action
方法。因此,当您调用Action{ ... }
时,实际上是在调用Action.apply({...})
,并且此apply
方法是从ActionBuilder
特性继承的。如果您查看ActionBuilder
特性,您将看到各种高阶apply
函数。
现在就您而言,def count = Action { Ok(counter.nextCount().toString) }
您实际上是在使用默认内容且没有请求参数的apply
方法进行调用。
final def apply(block: => Result): Action[AnyContent] = apply(_ => block)
这意味着,您正在提供块{ Ok(counter.nextCount().toString) }
,该块返回Ok
结果。
贝特文括号的内容是什么?大括号在这种情况下意味着什么?
执行Action { Ok(counter.nextCount().toString) }
时,实际上是在调用:
Action.apply(Ok(counter.nextCount().toString))
在scala中,apply
方法是一种工厂方法,因此您不必本质上调用apply方法,因此也可以执行Action(Ok(counter.nextCount().toString))
。此外,如果函数仅使用单个参数,则可以用花括号()
替换{}
括号。也就是说,您可以进行Action{Ok(counter.nextCount().toString)}
。
我建议研究一下函数文字,高阶函数,by-name参数,方法使用等。因此,您将对这些有更多的了解。
答案 1 :(得分:0)
源代码将为您提供详细信息:
/**
* Constructs an `Action` with default content, and no request parameter.
*
* For example:
* {{{
* val hello = Action {
* Ok("Hello!")
* }
* }}}
*
* @param block the action code
* @return an action
*/
final def apply(block: => Result): Action[AnyContent] =
apply(BodyParsers.utils.ignore(AnyContentAsEmpty: AnyContent))(_ => block)
相当于def count = Action.apply(Ok(counter.nextCount().toString))