メソッドごとに生成されるコードはわずかに異なります。
def h:play.api.templates.Html = {
_display_(
Seq[Any](format.raw("""<br />"""))
)
}
def i = {{Html("<br />")}}
作成に使用される_display_
メソッドは、渡された のすべての要素に対してh
a を実行することになりますfoldLeft
Seq
これにより、次の結果が得られます。
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
値にのみ設定されることを意味します。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"