以下代码(从 a question from about a year ago 复制)在 Scala 2.7.7 下运行良好,但在 Scala 2.8.0(Beta 1、RC8)下运行不正常。
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 中那样运行?
最佳答案
正如 pst 所说,输出是您对真正的 Java 数组的期望。 2.7 和 2.8 之间的变化之一是 Array[T]
现在完全是一个真正的 Java 数组。新的集合设计意味着对 Java 数组(例如 map
在您的示例中)执行 Scala 集合操作将返回一个 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
。这还有一个好处,即允许您使用非数组集合调用此方法。
关于xml - Scala 2.8.0中如何将二维数组写入xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2688445/