我遇到了这种让我感到惊讶的行为。基本上,如果我从两个不同的XML文字创建“相同的”XML select t.*,
(dense_rank() over (order by scname) - 1 +
row_number() over (partition by scname, fiberid order by fiberid)
) as grp
from t;
,它们就不能彼此相等。这里的独特之处在于我在一个中使用Elem
而在另一个中使用Boolean
。
String
这是预期的行为吗?
似乎Scala存储了基础类型,而布尔值并不严格等于String。
这是正确的解释吗?任何人都可以解释这里到底发生了什么?我找不到一种方法来检查两个节点中的底层类型。如果我看着这些孩子,他们看起来似乎是scala> import scala.xml._
import scala.xml._
scala> val t: Boolean = true
t: Boolean = true
scala> val fromBoolean: Elem = <b>{t}</b>
fromBoolean: scala.xml.Elem = <b>true</b>
scala> val fromString = <b>true</b>
fromString: scala.xml.Elem = <b>true</b>
scala> fromString == fromBoolean
res0: Boolean = false
。
Node
答案 0 :(得分:3)
您的解释是正确的。 fromString
的孩子为scala.xml.Text
,其范围为scala.xml.Atom[String]
:
scala> fromString.child(0).getClass.getName
res1: String = scala.xml.Text
scala> fromString.child(0).asInstanceOf[xml.Atom[_]].data.getClass.getName
res2: String = java.lang.String
fromBoolean
的孩子是scala.xml.Atom[Boolean]
:
scala> fromBoolean.child(0).getClass.getName
res3: String = scala.xml.Atom
scala> fromBoolean.child(0).asInstanceOf[xml.Atom[_]].data.getClass.getName
res4: String = java.lang.Boolean
data
的{{1}}个孩子fromString
的{{1}}类型Atom
以及String
的{{1}} data
fromBoolean
类型Atom
。 Boolean
(Atom
)的平等实施只是直接比较scala.xml.Atom#strict_==
,因此data
和String
比较不等。
我不确定区分Boolean
数据类型的目的是什么。在我看来,Atom
应该比较其数据的Atom
值。所以这种行为可能是个错误。
作为一种解决方法,我建议明确地将原子值转换为toString
。在这种情况下,平等是有效的:
String
Scala xml比较确实有更多的怪癖:
scala> <b>{true.toString}</b> == <b>true</b>
res5: Boolean = true
因此尝试手动实施比较可能是值得的。