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