Scala方法= trait {...}含义

时间:2013-11-13 20:08:48

标签: function scala methods lambda traits

我正在尝试同时学习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背景,所以我不知道这是什么意思? (这句话感觉就像是在说“方法索引= [某些界面动作]”,这对我来说没有意义;看起来好像正在发生,但这对我来说很神奇,而且我在我的代码中对魔法感到不安;))

2 个答案:

答案 0 :(得分:3)

当您调用一个对象就好像它是一个函数时,它被转换为对apply的调用。即:

foo(bar)

被翻译成

foo.apply(bar)

因此,在index内部,您正在调用Action对象,就好像它是一个函数一样,这意味着您实际调用Action.apply

省略了index的返回类型,因为编译器可以推断它是Action.apply的返回类型(我猜这个名称是Unit)。

答案 1 :(得分: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],所以可以推断出所有的参数/返回类型。