2013-02-15 65 views
5

當聲明Scala中的一個節點序列作爲文字你得到scala.xml.NodeBuffer,其是可變的(它延伸ArrayBuffer[scala.xml.Node]這又延伸Seq[scala.xml.Node]):爲什麼XML文字在Scala中產生可變對象?

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

似乎不可變的XML文字需要單個根節點(就像XML一樣)。 scala.xml.Group允許您使用<xml:group />的「奶嘴」根節點執行此操作。

這在API文檔中雄辯地描述爲「在一個節點中將XML節點分組以輸出」。

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> 
相關問題