gpt4 book ai didi

scala - 反 XML 组 "collect"未收集

转载 作者:行者123 更新时间:2023-12-01 11:57:08 24 4
gpt4 key购买 nike

我从 scala 用户交叉发布这个:

我有以下内容:

object XmlTest {

import com.codecommit.antixml._

implicit def toPicker(nodes: Group[Node]): Picker = new Picker(nodes)

class Picker(nodes: Group[Node]) {
def pick[A <: Node : ClassManifest]: Group[A] = nodes collect {
case a if implicitly[ClassManifest[A]].erasure.isInstance(a) => a.asInstanceOf[A]
}
}

def testCollect(elems: Group[Elem]) {
println("size before collect = " + elems.size)
val es = elems collect {
case e if e.name == "c" => println("element name is " + e.name); e
}
println("size after collect = " + es.size)
}

def main(args: Array[String]) {
val xml = XML.fromString("<a><b/><c/><d/></a>")

// this works because <a> has only elements as children
testCollect(xml.children.asInstanceOf[Group[Elem]])

// pick filters collection by type
testCollect(xml.children.pick[Elem])
}
}

当我运行它时,它打印了以下内容:

[info] size before collect = 3           // size is 3
[info] element name is c // element c matches
[info] size after collect = 1 // this is correct
[info] size before collect = 3 // size is the same as the previous case
[info] element name is c // element "c" is matched as well
[info] size after collect = 0 // this should be 1

我在这里迷路了。这是怎么回事?

最佳答案

这似乎是 Anti-XML 中的错误。即使没有所有 ClassManifest 魔法,它也很容易重现:

val xml = <a><b/><c/><d/></a>.anti
xml.children collect { case e => e } collect { case e => e } // => Group()

问题源于 ZipperflatMap 的实现。考虑到实现的重要性,有些东西肯定是不稳定的,这并不奇怪。我将添加一个测试用例,希望今晚能得到修复。

关于scala - 反 XML 组 "collect"未收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5951831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com