将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&amp; C 1
或者我对Elems的平等理解是错误的吗?
答案 0 :(得分:2)
这似乎是一个错误,虽然是一个非常奇怪的错误。我猜这是Set
而不是Elem
的错误,但在这一点上我不能说任何权威。
答案 1 :(得分:1)
我认为问题在于xml.MetaData
或其子类xml.Attribute
。比较两个Elem
时,会检查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")
E.g。它会删除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的相同元素,那么它们将是相等的。