2011-05-10 2 views
3

수집되지 않은 : 나는 그것을 실행하면안티 XML 그룹 "수집"나는 스칼라 사용자에서이 교차 게시하고

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 

나는 여기에 있습니다. 무슨 일 이니?

+1

작은 세부 사항 : 암시 적으로 [ClassManifest [A]] 대신'classManifest [A]'를 쓸 수 있습니다. –

+0

당신은 anti-xml을 사용하고 있다는 것을 명시해야합니다. –

답변

5

이것은 Anti-XML의 버그 인 것으로 보입니다. 그것은 ClassManifest 마법의 모든 없이도 재현 꽤 쉽게 :

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

문제는 Zipper에서 flatMap의 구현에 따른된다. 구현이 얼마나 사소한지를 고려해 볼 때, 뭔가 어색하고 놀라운 일이 아닙니다. 테스트 케이스를 추가하고 오늘 밤 픽스를 얻을 것입니다.