Scalaでノードシーケンスをリテラルとして宣言すると、変更可能なaが生成されますscala.xml.NodeBuffer
(これは拡張ArrayBuffer[scala.xml.Node]
され、次に拡張されますSeq[scala.xml.Node]
)。
scala> val xml = <a /><b />
xml: scala.xml.NodeBuffer = ArrayBuffer(<a></a>, <b></b>)
scala> xml += <c />
res46: xml.type = ArrayBuffer(<a></a>, <b></b>, <c></c>)
scala> xml
res47: scala.xml.NodeBuffer = ArrayBuffer(<a></a>, <b></b>, <c></c>)
これは、不変オブジェクトと関数型プログラミングを使用するというScalaの哲学と矛盾します。コレクションがデフォルトで不変であるのに、XMLリテラル(第一級市民)がこの場合ではないのはなぜですか?
しかし、XMLリテラルを使用して不変のノードシーケンスを安全に定義することは可能ですか?