为每种方法生成的代码略有不同。
def h:play.api.templates.Html = {
_display_(
Seq[Any](format.raw("""<br />"""))
)
}
def i = {{Html("<br />")}}
创建中使用的_display_
方法h
最终foldLeft
对传入的所有元素执行 aSeq
这导致:
Html("") + Html("<br />")
case 类原来Html
是由一个 mutable 支持的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
}
这意味着 of 的值text
只会被设置为 firstHtml
的text
值。每当您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"