为什么XML文本在Scala中产生可变对象?

为什么XML文本在Scala中产生可变对象?,xml,scala,immutability,Xml,Scala,Immutability,将Scala中的节点序列声明为文本时,会产生一个可变的Scala.xml.NodeBuffer(它扩展了ArrayBuffer[Scala.xml.node],反过来又扩展了Seq[Scala.xml.node]): scala>val xml= xml:scala.xml.NodeBuffer=ArrayBuffer(,) scala>xml+= res46:xml.type=ArrayBuffer(,) scala>xml res47:scala.xml.NodeBuffer=ArrayBu

将Scala中的节点序列声明为文本时,会产生一个可变的
Scala.xml.NodeBuffer
(它扩展了
ArrayBuffer[Scala.xml.node]
,反过来又扩展了
Seq[Scala.xml.node]
):

scala>val xml=
xml:scala.xml.NodeBuffer=ArrayBuffer(,)
scala>xml+=
res46:xml.type=ArrayBuffer(,)
scala>xml
res47:scala.xml.NodeBuffer=ArrayBuffer(,)
这与Scala使用不可变对象和函数式编程的理念相矛盾。为什么集合在默认情况下是不可变的,而XML文本(第一类公民)在这种情况下不是不可变的


但是,是否可以使用XML文本安全地定义不可变的节点序列?

似乎不可变的XML文本需要单个根节点(XML也是如此)
scala.xml.Group
允许您使用
的“pacifier”根节点执行此操作

这在API文档中被雄辩地描述为“将XML节点分组到一个节点中以进行输出的黑客行为”

scala>val xml=
xml:scala.xml.Group=
将此片段与其他XML组合时,组节点将消失:

scala> <foo>{xml}</foo>
res1: scala.xml.Elem = <foo><a></a><b></b></foo>
scala>{xml}
res1:scala.xml.Elem=
scala> val xml = <xml:group><a /><b /></xml:group>
xml: scala.xml.Group = <a></a><b></b>
scala> <foo>{xml}</foo>
res1: scala.xml.Elem = <foo><a></a><b></b></foo>