Это ошибка в scala.xml.Elem? - PullRequest
       1

Это ошибка в scala.xml.Elem?

5 голосов
/ 05 января 2011

Отображение Set [String] на атрибуты Set [Elem] прекрасно работает с одним атрибутом, но, похоже, не работает с несколькими атрибутами, когда один из них используется совместно:

scala> val s1=Set("A","B","C")
s1: scala.collection.immutable.Set[java.lang.String] = Set(A, B, C)

scala> s1.map((a:String)=>{<X w={a}></X>})
res3: scala.collection.immutable.Set[scala.xml.Elem] = Set(<X w="A"></X>, <X w="B"></X>, <X w="C"></X>)

scala> s1.map((a:String)=>{<X w={a} k="SSS"></X>})
res4: scala.collection.immutable.Set[scala.xml.Elem] = Set(<X k="SSS" w="A"></X>)

Что случилось с B& C?

Или мое понимание равных по Элемсу неверно?

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Это похоже на ошибку, хотя и очень странную.Я бы предположил, что это ошибка в Set, а не Elem, но я не могу говорить с какими-либо полномочиями по этому вопросу.

1 голос
/ 05 января 2011

Я думаю, что проблема заключается в xml.MetaData или его подклассе xml.Attribute. При сравнении двух Elem s проверяется равенство префикса xml, метки, атрибутов и дочерних элементов Node.

Теперь у xml.MetaData есть странная реализация, она содержит себя и в то же время связанный список атрибутов. Это означает, что, например:

scala >val elem = <e x="a" y="b"></e>
elem: scala.xml.Elem = <e y="b" x="a"></e>

scala> elem.attributes
res50: scala.xml.MetaData =  y="b" x="a"

scala> elem.attributes.toSet
res51: Set[scala.xml.MetaData] = Set( y="b" x="a",  x="a")

например. он генерирует список сам с удаленным атрибутом head.

Проверка на равенство в MetaData выглядит следующим образом

this.toSet == other.toSet

, который работает нормально, но переопределяется в классе Attribute. (Мы не можем видеть это в REPL, но наш elem.attributes на самом деле Attribute.) Там код только делает это

(this.pre == other.pre) && (this.key == other.key) && (this.value sameElements other.value)

Что было бы хорошо, если бы список атрибутов был преобразован в Set ранее, но это не так, и только первый элемент в списке атрибутов проверяется на равенство. И, таким образом, если элемент head во внутреннем связанном списке атрибутов окажется одним и тем же элементом в течение двух xml.Elem s, они будут равны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...