Scala XML literal - Boolean vs String

时间:2018-04-25 21:49:43

标签: scala scala-xml

我遇到了这种让我感到惊讶的行为。基本上,如果我从两个不同的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

1 个答案:

答案 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类型AtomBooleanAtom)的平等实施只是直接比较scala.xml.Atom#strict_==,因此dataString比较不等。

我不确定区分Boolean数据类型的目的是什么。在我看来,Atom应该比较其数据的Atom值。所以这种行为可能是个错误。

作为一种解决方法,我建议明确地将原子值转换为toString。在这种情况下,平等是有效的:

String

Scala xml比较确实有更多的怪癖:

scala> <b>{true.toString}</b> == <b>true</b>
res5: Boolean = true

因此尝试手动实施比较可能是值得的。