2013-02-15 6 views
5

Quando si dichiara una sequenza nodo Scala come letterali cedi un scala.xml.NodeBuffer che è mutabile (si estende ArrayBuffer[scala.xml.Node] che a sua volta si estende Seq[scala.xml.Node]):Perché i letterali XML restituiscono oggetti mutabili in 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>) 

Questo contraddice filosofia di Scala di utilizzare oggetti immutabili e programmazione funzionale. Perché le collezioni sono immutabili per impostazione predefinita, ma i letterali XML (che sono cittadini di prima classe) non sono in questo caso?

Tuttavia, è possibile definire in modo sicuro una sequenza di nodi immutabile utilizzando valori letterali XML?

risposta

4

Sembra che i letterali XML immutabili richiedano un singolo nodo radice (come XML). scala.xml.Group consente di eseguire questa operazione utilizzando un nodo radice "pacifier" di <xml:group />.

Questo è eloquentemente descritto nei documenti API come "Un hack per raggruppare nodi XML in un nodo per l'output."

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

Quando si combina questo frammento con altri XML, il nodo gruppo scompare:

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