1

这里使用什么语言构造来创建 Action 实例?我认为在 Scala 中可以使用以下方法实例化一个类:

  • 直接构造函数调用:new Action(params)
  • 伴随对象的调用apply()方法(通常调用构造函数):Action(params)

但是在 Play 的 Scaladoc 中!动作见以下片段:

val echo = Action { request =>
  Ok("Got request [" + request + "]")
}

这里叫什么?我知道我们创建了函数request => response,但是这个函数在哪里传递?

4

3 回答 3

5

您的示例等效于:

val echo = Action.apply(request => Ok("Got request [" + request + "]"))

因此,您实际上是在调用 objectActionapply方法并将其传递给匿名函数。

请注意,在 Scala 中,您通常可以互换括号和大括号,例如,如果您有此功能

def f(a: Int) = a + 42

这些调用是等效的:

f(23)
f { 23 }

接下来发生的事情是您可以省略apply方法的名称。因此,如果您有这样的对象:

object f { def apply(a: Int) = a + 42 }

这些调用都是等价的:

f.apply(23)
f.apply { 23 }
f(23)
f { 23 }
f apply 23
f apply { 23 }
于 2013-06-15T16:21:15.913 回答
2

基本上,您正在调用 Action 伴随对象的 apply 方法。正如 Andreas 在方法调用期间指出的那样 () 可以替换为 {} AFAIK。

api doc动作对象

def apply(block: (Request[AnyContent]) ⇒ Result): Action[AnyContent]

Action 是 ActionBuilder 的子类。它转到播放框架工作源代码中的此方法调用。

于 2013-06-15T18:07:46.720 回答
0

综上所述,对于您来说,CTRL + 单击 IDE 中的类/方法名称并查看源代码也会很有用。这有时会澄清很多。请尝试一下,您将在 ActionBuilder 类中看到 3 或 4 个不同的 apply() 方法变体。

于 2013-11-06T14:34:39.277 回答