Scala实现内联特征方法

时间:2018-07-01 18:51:58

标签: scala playframework traits

我已经开始学习scala和play框架。我从播放框架网站下载了示例项目。我有一个新手问题,因为我无法理解以下语法:

def count = Action { Ok(counter.nextCount().toString) }

它到底是做什么的? Action是在BaseController中实现的功能,已在其中分配了操作生成器。 beetwen大括号的内容是什么?大括号在这种情况下意味着什么?

2 个答案:

答案 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))