2010-04-22 63 views
2

以下代碼(從a question from about a year ago複製而來)在Scala 2.7.7下正常工作,但在Scala 2.8.0(Beta 1,RC8)下無法正常工作。如何在Scala中將二維數組寫入xml 2.8.0

import scala.xml 

class Person(name : String, age : Int) { 
    def toXml(): xml.Elem = 
     <person><name>{ name }</name><age>{ age }</age></person> 
} 

def peopleToXml(people: Array[Person]): xml.Elem = { 
    <people>{ for {person <- people} yield person.toXml }</people> 
} 

val data = Array(new Person("joe",40), new Person("mary", 35)) 

println(peopleToXml(data)) 

(根據2.7.7)的輸出應該是:

<people><person><name>joe</name><age>40</age></person><person><name>mary</name><age>35</age></person></people>

而是出來爲:

<people>\[Lscala.xml.Elem;@17821782</people>

我如何得到這個行爲就像它在2.7.x中所做的那樣?

回答

3

此代碼需要兩次轉換。首先,您必須將由理解返回的Array[xml.Elem]轉換爲Seq[xml.Elem],然後在xml.NodeSeq中的隱式轉換將將該轉換轉換爲xml.NodeSeq

如果更改peopleToXml在下文中,將如預期:

def peopleToXml(people: Array[Person]): xml.Elem = { 
    val a: Seq[xml.Elem] = for {person <- people} yield person.toXml 
    <people>{a}</people> 
} 

您還可以做下面的,如果你喜歡它的短:-)

def peopleToXml(people: Array[Person]): xml.Elem = { 
    <people>{(for {person <- people} yield person.toXml): Seq[xml.Elem]}</people> 
} 
+0

謝謝邁克爾,這將很好地工作。 – Shadowlands 2010-04-22 06:19:32

1

產量返回一個真正的Java數組,它按照普通的Java規則進行字符串化。這是由「[Ltype; @ref」輸出。也許你可以將它(人員或結果出來)轉換爲List,並且可以更好地「串化」語義。我想Scala 2.7.7完全返回一個不同的(非數組)集合類型。

Fighting Bit Rot With Types談論新Scala 2.8集合設置「一般」,但沒有具體說明。在scala-lang.org上可能會有更多的好處,並且一如既往地歡迎您訪問freenode上的#scala :-)

+0

有點像這樣的東西,但無法弄清楚如何(或何處)讓Java數組轉換回有用的東西。謝謝。 – Shadowlands 2010-04-22 06:21:04

4

由於PST說,輸出結果是您對真正的Java數組所期望的結果。 2.7和2.8之間的變化之一是,Array[T]現在是正好是一個真正的Java數組。新的集合設計意味着在Java數組上執行Scala集合操作(​​例如,在您的示例中爲map)將作爲結果返回Java數組。這意味着以下內容

for {person <- people} yield person.toXml 

用於不返回Java數組,但現在做。您可以通過更改peopleToXml方法的people參數的類型,如下所示解決此問題:

def peopleToXml(people: Seq[Person]): xml.Elem = { 
    <people>{ for {person <- people} yield person.toXml }</people> 
} 

這將意味着,當你調用這個方法與Array說法,該陣列將被隱式轉換爲WrappedArray,其行爲如您所願。這也可以讓你使用非數組集合來調用這個方法。

相關問題