6

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リテラルを使用して不変のノードシーケンスを安全に定義することは可能ですか?

4

1 に答える 1

5

不変のXMLリテラルには、(XMLと同様に)単一のルートノードが必要なようです。scala.xml.Groupの「おしゃぶり」ルートノードを使用して、これを行うことができます<xml:group />

これは、APIドキュメントで「出力用にXMLノードを1つのノードにグループ化するためのハック」として雄弁に説明されています。

scala> val xml = <xml:group><a /><b /></xml:group>
xml: scala.xml.Group = <a></a><b></b>

このフラグメントを他のXMLと組み合わせると、グループノードが消えます。

scala> <foo>{xml}</foo>
res1: scala.xml.Elem = <foo><a></a><b></b></foo>
于 2013-02-15T10:15:45.253 に答える