xml
是否有匹配以下模式的值?
xml match { case <foo> { x } </foo> => 42 }
最佳答案
是的。
scala> val x = 33
x: Int = 33
scala> val xml = <foo> { x } </foo>
xml: scala.xml.Elem = <foo> 33 </foo>
scala> xml match { case <foo> { x } </foo> => 42 }
res0: Int = 42
我认为您的困惑来自于它与 <foo> 33 </foo>
不匹配
scala> <foo> 33 </foo> match { case <foo> { x } </foo> => 42 }
scala.MatchError: <foo> 33 </foo> (of class scala.xml.Elem)
这是因为当你使用 {}
, scala 为 {}
前后的空格插入额外的元素,所以你得到三个元素,而不是一个。你可以通过调用 unapplySeq
来查看。 (这是用于模式匹配的):
scala> scala.xml.Elem.unapplySeq(<foo> 33 </foo>)
res4: Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] =
Some((null,foo,,,ArrayBuffer( 33 )))
scala> scala.xml.Elem.unapplySeq(<foo> { x } </foo>)
res5: Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] =
Some((null,foo,,,ArrayBuffer( , 33, )))
请注意,在第二个示例中,您在 ArrayBuffer 中获得了三个元素,而在第一个示例中只有一个。所以模式没有正确匹配。
关于xml - 带空格的 Scala XML 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8711558/