gpt4 book ai didi

scala - Play 模板仅在使用括号调用时有效

转载 作者:行者123 更新时间:2023-12-04 23:41:34 25 4
gpt4 key购买 nike

我的 Application 中有以下代码 Controller :

  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 是 Play 模板引擎)的 Scala 代码可能会有所启发。 :

@()

<h1>Hello, world</h1>

默认情况下,Play 会将其编译为 target/scala-2.11/twirl/main/views/html/index.template.scala 中的 Scala 文件。 ,并且,如果您稍微清理一下以删除源映射(这可以将模板中的编译错误转换为输入文件中的正确行),它将如下所示:
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

需要注意的重要一点是 views.html.index是一个对象,类型为 views.html.index.type , 如果你不添加括号,这就是你所指的。然而,这个对象扩展了一个名为 views.html.index_Scope0.index 的类。 ,它有一个 apply()方法,返回 Html对象(或者更确切地说, HtmlFormat.Appendable ,这是无别名的类型。)

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

关于scala - Play 模板仅在使用括号调用时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35854330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com