2012-01-03 3 views

답변

5

예. 당신의 혼란이 <foo> 33 </foo>

scala> <foo> 33 </foo> match { case <foo> { x } </foo> => 42 } 
scala.MatchError: <foo> 33 </foo> (of class scala.xml.Elem) 

에 일치하지 않는되어 들어오는 곳

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 

는 생각이 때문에 당신은 공간에 대한 추가 요소 전과 {}을 한 후 {}, 스칼라 삽입을 사용할 때 , 그래서 당신은 하나가 아닌 3 가지 요소를 얻습니다. 당신은 (패턴 매칭에 사용되는 것입니다) 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 요소, 첫 번째에 하나가 있어요. 따라서 패턴이 올바르게 일치하지 않습니다.

+0

맞아요, 고마워요! Elem.unapplySeq에 대해서도 알아두면 편리합니다. –

관련 문제