Scala 播放模板仅在使用括号调用时有效

Scala 播放模板仅在使用括号调用时有效,scala,playframework,Scala,Playframework,我的应用程序控制器中有以下代码: def index = Action { var ticketsAvailable = 1 Ok(views.html.index) } 尝试运行应用程序时,出现以下编译错误: Cannot write an instance of views.html.index.type to HTTP response. Try to define a Writeable[views.html.index.type] 在线 Ok(views.h

我的
应用程序
控制器中有以下代码:

  def index = Action {
    var ticketsAvailable = 1
    Ok(views.html.index)
  }
尝试运行应用程序时,出现以下编译错误:

Cannot write an instance of views.html.index.type to HTTP response. Try to define a Writeable[views.html.index.type]
在线

Ok(views.html.index) 
但是,当我添加括号(如下所示)时,错误消失:

Ok(views.html.index()) 
为什么呢?
我认为,在Scala中,当没有参数时,括号的使用是可选的。

对于一个名为
index.Scala.html
的简单Twirl模板(Twirl是播放模板引擎),查看生成的Scala代码可能会有所启发:

@()

<h1>Hello, world</h1>
需要注意的重要一点是,
views.html.index
是一个对象,其类型为
views.html.index.type
,如果不添加参数,这就是您所指的对象。但是,这个对象扩展了一个名为
views.html.index\u Scope0.index
的类,该类有一个
apply()
方法,该方法返回一个
html
对象(或者更确切地说,
HtmlFormat.appendeable
,它是一个非关联类型)

如果“调用”Scala对象,Scala会将其转换(或“去糖”)为对对象调用
apply()
方法(这是case类构造函数在不使用
new
的情况下的工作方式),因此,如果使用parens,则会得到一个
Html
对象,它是呈现的Twirl模板的结果。如果不这样做,则只会得到编译后的模板对象本身,而该对象本身不知道如何写入HTTP响应。

您认为是错误的。看见
package views.html
import play.twirl.api._

object index_Scope0 {
  import models._
  import controllers._
  import play.api.i18n._
  import views.html._
  import play.api.templates.PlayMagic._
  import play.api.mvc._
  import play.api.data._

  class index
    extends BaseScalaTemplate[play.twirl.api.HtmlFormat.Appendable, Format[play.twirl.api.HtmlFormat.Appendable]](play.twirl.api.HtmlFormat)
    with play.twirl.api.Template0[play.twirl.api.HtmlFormat.Appendable] {

    def apply(): play.twirl.api.HtmlFormat.Appendable = {
      _display_ {
        {
          Seq[Any](format.raw(""""""), format.raw("""<h1>hello, world</h1>"""))
        }
      }
    }

    def render(): play.twirl.api.HtmlFormat.Appendable = apply()
    def f: (() => play.twirl.api.HtmlFormat.Appendable) = () => apply()
    def ref: this.type = this
  }
}

object index extends index_Scope0.index