2012-01-03 12 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は{}の前後にスペースのための余分な要素を挿入するためですあなたは3つの要素を取得します.1つではありません。あなたは(パターンマッチングのために使用されるものである)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, ))) 

お知らせを第二の例では、次の3つのArrayBufferの要素、および最初で唯一の1を取得しています。したがって、パターンが正しく一致しません。

+0

正直、ありがとう! Elem.unapplySeqについて知っておくととても便利です。 –

関連する問題