2012-01-03 71 views

回答

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> 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三个要素,只有一个第一:您可以通过调用unapplySeq看到这个(这是用于模式匹配)。所以模式不正确。

+0

Righty,谢谢!了解Elem.unapplySeq也非常方便。 – 2012-01-03 13:00:58