2012-01-03 82 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