{html is empty} case _ => {html has content-6ren">
gpt4 book ai didi

templates - 为什么在 play 2 scala 模板中构造的 html 会产生一个空的 Html case 类

转载 作者:行者123 更新时间:2023-12-04 05:39:24 24 4
gpt4 key购买 nike

为什么这个输出“html为空”?

@h = {<br />}

@h match {
case Html("") => {html is empty}
case _ => {html has content}
}

这输出“html有内容”?
@i = @{Html("<br />")}

@i match {
case Html("") => {html is empty}
case _ => {html has content}
}

这对我很重要的原因是因为在 common use cases最后一个示例(moreScripts 和 moreStyles 等价物),第一个样式用于将 html 文件传递​​到另一个模板中。然后我想根据该 html 是否有内容进行切换。但它总是与 Html("") 匹配。

最佳答案

为每种方法生成的代码略有不同。

def h:play.api.templates.Html = {
_display_(
Seq[Any](format.raw("""<br />"""))
)
}
def i = {{Html("<br />")}}
_display_创建时使用的方法 h最终执行了 foldLeftSeq 中传递的所有元素上

这导致:
Html("") + Html("<br />")
Html案例类原来是由一个可变的 StringBuilder 支持的.
case class Html(text: String) extends Appendable[Html] with Content with play.mvc.Content {
val buffer = new StringBuilder(text)

/**
* Appends this HTML fragment to another.
*/
def +(other: Html): Html = {
buffer.append(other.buffer)
this
}
override def toString = buffer.toString

/**
* Content type of HTML (`text/html`).
*/
def contentType: String = "text/html"

def body: String = toString

}

这意味着 text 的值只会被设置为第一个 Html 的值的 text值(value)。每当您创建一个新 Html通过 +方法你只修改 StringBuilder .

例如
val html = Html("1") + Html("2")
html.text == "1"
html.toString == "12"
html.body == "12"

既然是 text用于模式匹配的值这有效地破坏了它在模式匹配中使用的能力。

例如
(Html("1") + Html("2")) match { case Html("1") => "broken" } // returns "broken"

关于templates - 为什么在 play 2 scala 模板中构造的 html 会产生一个空的 Html case 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11453494/

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