Scala Play 2.4视图渲染与应用

Scala Play 2.4视图渲染与应用,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我注意到views.html.myView.render(…)和views.html.myView(…)都可以用于从模板生成页面。但是,如果我们需要将隐式参数列表传递到视图中,则似乎只有apply版本可以工作,而render版本不能编译 我假设views.html.myView.apply可能在幕后委托给views.html.myView.render(或其他方式),但我不确定,也无法在文档中找到与此相关的任何内容。我能从Twirl文档中得到的唯一一件事是,TemplateN特性都定义了rend

我注意到
views.html.myView.render(…)
views.html.myView(…)
都可以用于从模板生成页面。但是,如果我们需要将隐式参数列表传递到视图中,则似乎只有
apply
版本可以工作,而
render
版本不能编译


我假设
views.html.myView.apply
可能在幕后委托给
views.html.myView.render
(或其他方式),但我不确定,也无法在文档中找到与此相关的任何内容。我能从Twirl文档中得到的唯一一件事是,
TemplateN
特性都定义了
render
方法,但没有一个提到
apply

render
方法是从Java使用的,而
apply
是从Scala使用的。将委托呈现给
apply
,它们将具有完全相同的签名,除非存在多个参数列表(从currying或implicits)

假设我有play scala activator模板中的
index.html.scala
,修改后添加了一个隐式
Int
参数:

@(message: String)(implicit i: Int)
它将被编译成
target/scala-2.11/twirl/main/views/html/index.template.scala
。以下是相关内容:

def apply(message: String)(implicit i: Int): play.twirl.api.HtmlFormat.Appendable = ...

def render(message: String, i: Int): play.twirl.api.HtmlFormat.Appendable =
    apply(message)(i)
render
中的参数被压缩到一个列表中。由于不能使用来自Java的隐式(或多个参数列表),因此需要在单个列表中显式传递它们

如果删除隐式,则它们是相同的:

def apply(message: String): play.twirl.api.HtmlFormat.Appendable = ...

def render(message:String): play.twirl.api.HtmlFormat.Appendable = apply(message)

回答得好!这就解释了为什么
render
没有编译,尽管我在范围中有相应的隐式表达式。