xml
的值是否与以下模式匹配?
xml match { case <foo> { x } </foo> => 42 }
答案 0 :(得分:5)
是
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中获得了三个元素,而第一个中只有一个元素。所以模式不正确。