【问题标题】:How to write two-dimensional array to xml in Scala 2.8.0如何在 Scala 2.8.0 中将二维数组写入 xml
【发布时间】:2011-02-10 22:04:37
【问题描述】:

以下代码(复制自 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)应该是:

&lt;people&gt;&lt;person&gt;&lt;name&gt;joe&lt;/name&gt;&lt;age&gt;40&lt;/age&gt;&lt;/person&gt;&lt;person&gt;&lt;name&gt;mary&lt;/name&gt;&lt;age&gt;35&lt;/age&gt;&lt;/person&gt;&lt;/people&gt;

但结果却是:

&lt;people&gt;\[Lscala.xml.Elem;@17821782&lt;/people&gt;

如何让它像在 2.7.x 中一样运行?

【问题讨论】:

    标签: xml scala arrays


    【解决方案1】:

    正如 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。这还具有允许您使用非数组集合调用此方法的好处。

    【讨论】:

      【解决方案2】:

      此代码需要两次转换。首先,您必须将 for 理解返回的 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>
      }
      

      【讨论】:

        【解决方案3】:

        yield 返回一个真正的 java 数组,该数组按照普通的 Java 规则进行字符串化。这是由 "[Ltype;@ref" 输出给出的。

        也许您可以将它(人入或结果出)转换为列表并获得更好的“字符串”语义。我想 Scala 2.7.7 完全返回一个不同的(非数组)集合类型。

        Fighting Bit Rot With Types“大体上”谈论新的 Scala 2.8 Collections 设置,但忽略了细节。 scala-lang.org 上可能会有更多好处,并且一如既往地欢迎访问 freenode 上的#scala :-)

        【讨论】:

        • 有点想它是这样的,但无法弄清楚如何(或在哪里)将 Java 数组转换回有用的东西。谢谢。
        猜你喜欢
        • 2017-01-03
        • 1970-01-01
        • 2012-04-07
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多