Scala 播放框架模板不';我没有Html类型

Scala 播放框架模板不';我没有Html类型,scala,playframework-2.0,Scala,Playframework 2.0,我有一个名为mainBody的模板,格式如下: @(title: String)(html: Html, moreScripts: Html = Html("")) 我可以这样说 views.html.mainBody("All properties")(views.html.showProperties(list)) views.html.showProperties()是另一个模板。我的印象是模板只是返回Html的函数。但是,如果我将此扩展到: views.html.mainBody("

我有一个名为
mainBody
的模板,格式如下:

@(title: String)(html: Html, moreScripts: Html = Html(""))
我可以这样说

views.html.mainBody("All properties")(views.html.showProperties(list))
views.html.showProperties()
是另一个模板。我的印象是模板只是返回
Html
的函数。但是,如果我将此扩展到:

views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts)
其中
views.html.showPropertiesScripts
只是一个带有一些html代码的模板,我得到了错误:

play.PlayExceptions$CompilationException: Compilation error[type mismatch;
 found   : views.html.showPropertiesScripts.type
 required: play.twirl.api.Html]
        at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
        at play.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
        at scala.Option.map(Option.scala:145) ~[scala-library-2.11.2.jar:na]
        at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:234) ~[na:na]
        at play.PlayReloader$$anon$1$$anonfun$play$PlayReloader$$anon$$taskFailureHandler$1.apply(PlayReloader.scala:229) ~[na:na]

我不明白。
views.Html.showPropertiesScript
不是预期的类型
Html
,而是
views.Html.showPropertiesScript.type
?这是什么?为什么
views.html.showPropertiesScript
不是
html
类型(像我的其他模板一样)?

mainBody.scala.html一样使用它:

@(title: String, moreScripts: Html = Html(""))(html: Html)
<!DOCTYPE html>
<html>
    <head lang="en">
      <title>@title</title>
      @moreScripts
    </head>
    <body>
       @html
    </body>
</html>
我认为你把“类型”和“返回类型”混为一谈了。大概是
views.html.showPropertiesScript
是一个不带任何参数的模板(它以
@()
开头)。如果是这种情况,它没有类型
Html
,而是一个带有
def apply():Html
的类,这就是为什么用括号“调用”它时,它返回
Html
。您可以将其视为具有类型
()=>Html
。你应该试试:

views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts())

你可能会被这个概念搞糊涂。这在处理
apply
时不起作用,因为如果您关闭参数列表,Scala会将您解释为引用对象本身,而不是
apply

的结果。这很有效,我更喜欢这种样式。但是,你能解释一下为什么我的原始代码不起作用吗?Mike TBH我从来没有分析过Play的模板引擎,如果你感兴趣,请下载源代码;)一般规则是在第一个括号中声明视图的所有参数(强制和可选),在第二个括号中声明内容。作品
@(list: List[YourType])

@mainBody(title = "Other view") {
    @showProperties(list)
}
views.html.mainBody("All properties")(views.html.showProperties(list), views.html.showPropertiesScripts())