2013-02-15 7 views
5

जब शाब्दिक रूप में स्काला में एक नोड अनुक्रम की घोषणा आप उपज एक 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>) 

यह अपरिवर्तनीय वस्तुओं और कार्यात्मक प्रोग्रामिंग का उपयोग करने का स्काला के दर्शन के विपरीत है। क्यों डिफॉल्ट डिफ़ॉल्ट रूप से अपरिवर्तनीय हैं, लेकिन एक्सएमएल अक्षर (जो प्रथम श्रेणी के नागरिक हैं) इस मामले में नहीं हैं?

हालांकि, क्या XML अक्षरों का उपयोग करके एक अपरिवर्तनीय नोड अनुक्रम को सुरक्षित रूप से परिभाषित करना संभव है?

उत्तर

4

ऐसा लगता है कि अपरिवर्तनीय एक्सएमएल अक्षरों को एक रूट रूट (जैसे एक्सएमएल करता है) की आवश्यकता होती है। scala.xml.Group आपको <xml:group /> के "pacifier" रूट नोड का उपयोग करके ऐसा करने की अनुमति देता है।

यह एपीआई डॉक्स में "आउटपुट के लिए एक नोड में एक्सएमएल नोड्स समूह करने के लिए एक हैक" के रूप में वर्णित है।

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> 
संबंधित मुद्दे