2013-02-15 11 views
5

Deklarując sekwencję węzeł w Scali jako literały jesteś uzyskując scala.xml.NodeBuffer który jest zmienny (rozciąga ArrayBuffer[scala.xml.Node] która z kolei rozciąga Seq[scala.xml.Node]):Dlaczego literały XML dostarczają zmienne obiekty w Scali?

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>) 

to sprzeczne filozofię Scala korzystania niezmienne obiekty i programowanie funkcyjne. Dlaczego kolekcje są domyślnie niezmienne, ale literały XML (które są obywatelami pierwszej klasy) nie są w tym przypadku?

Czy istnieje jednak możliwość bezpiecznego zdefiniowania niezmiennej sekwencji węzłów za pomocą literałów XML?

Odpowiedz

4

Wydaje się, że niezmienne literały XML wymagają jednego węzła głównego (tak jak XML). scala.xml.Group pozwala to zrobić, używając węzła głównego "pacyfikator" o numerze <xml:group />.

to wymownie opisane w docs API jako „hack do grupy węzłów XML w jednym węźle na wyjściu”.

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

Kiedy połączy ten fragment z innego pliku XML, węzeł grupa znika:

scala> <foo>{xml}</foo> 
res1: scala.xml.Elem = <foo><a></a><b></b></foo> 
Powiązane problemy