4

我正在尝试同时学习 Scala 和 Play Framework。在我看来,Scala 有很多非常酷的想法,但我的挫败感之一是试图理解方法/函数/lambdas/匿名函数/等的所有不同语法。

所以我有我的主应用程序控制器,如下所示:

object Application extends Controller {
  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }
}

这告诉我我有一个单例Application,它有一个方法,index返回什么类型?我期待index有一个更像的定义:

def index(req: Request) : Result = { ... }

查看 Play Framework 的文档,它看起来好像Action是一个特征,它将请求转换为结果,因为我很难理解这行在说什么:

def index = Action { ... }

我来自Java背景,所以我不知道这是在说什么?(这句话感觉像是在说“method index = [some interface Action]”,这对我来说没有意义;似乎正在发生一些美好的事情,但对我来说它是魔法,我对我的代码中的魔法感到不安;))

4

2 回答 2

3

当您像调用函数一样调用对象时,这将转换为对apply. IE:

foo(bar)

被翻译成

foo.apply(bar)

所以,index你在内部调用Action对象,就好像它是一个函数,这意味着你实际上是在调用Action.apply.

的返回类型index被省略了,因为编译器可以推断出它的返回类型Action.apply(我从名字猜想是Unit)。

于 2013-11-13T20:18:23.580 回答
1

因此,对这个问题的简短回答是,在幕后发生了一些事情,使上述工作得以实现:即编译器正在推断类型,而在 Scala 中,具有apply方法的对象可以像函数一样被调用。

所以这里发生的是这段代码:

def index = Action {
  Ok("Hello World!")
}

...等效于(或简写)此代码:

def index : Action[AnyContent] = Action.apply(
    (req: Request[AnyContent]) => {
        Ok(views.html.index("Hello World!"))
    } : Result
)

魔术在这里发生:... = Action {...}. Action {...}说“Action用这个匿名函数调用{...}”。

因为Action.apply被定义为apply(block: => Result): Action[AnyContent],所以可以推断出所有的参数/返回类型。

于 2013-11-13T22:11:11.860 回答