XML в Scala - метод Elem с логическим значением minimEmpty

Метод Elem (prefix, label, attribs, scope, child) устарел в Scala 2.10, и следует использовать Elem (prefix, label, attribs, scope, minimEmpty, child). Однако, по крайней мере, для пустых элементов новый метод apply ведет себя иначе. Устаревшая версия работает следующим образом:

val inputXML = <PC Price="100" CurrencyCode="USD"/>
val rule1 = new RewriteRule {
    override def transform(n: Node): Seq[Node] = n match {
        case Elem(prefix, "PC", attribs, scope, content @ _*)  => 
            Elem(prefix, "Mac", attribs, scope, content:_*)
        case other => other
    }
}

println(new RuleTransformer(rule1).transform(inputXML))

который печатает:

List(<Mac Price="100" CurrencyCode="USD"/>) 

Но при использовании нового метода Elem сопоставление не работает:

val inputXML = <PC Price="100" CurrencyCode="USD"/>
val rule1 = new RewriteRule {
    override def transform(n: Node): Seq[Node] = n match {
        case Elem(prefix, "PC", attribs, scope, minimizeEmpty, content @ _*)  => 
            Elem(prefix, "Mac", attribs, scope, true, content:_*)
        case other => other
    }       
}

println(new RuleTransformer(rule1).transform(inputXML))

Приведенный выше код возвращает:

<PC Price="100" CurrencyCode="USD"/>

Это ошибка или я что-то не так делаю? Я использую Scala 2.10.2.

Спасибо,


person centr    schedule 28.06.2013    source источник


Ответы (1)


В Elem есть только один unapply метод:

def unapplySeq(n: Node): Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])]

Он возвращает Tuple5, но вы пытаетесь использовать его так же, как он возвращает Tuple6. Вы не можете получить minimizeEmpty методом unapplySeq.

val inputXML = <PC Price="100" CurrencyCode="USD"/>
val rule1 = new RewriteRule {
    override def transform(n: Node): Seq[Node] = n match {
        case Elem(prefix, "PC", attribs, scope, content @ _*)  => 
            Elem(prefix, "Mac", attribs, scope, true, content:_*)
        case other => other
    }       
}

println(new RuleTransformer(rule1).transform(inputXML))
// List(<Mac Price="100" CurrencyCode="USD"/>)

Но я предполагаю, что здесь есть ошибка. Этот метод должен называться unapply, чтобы показать ошибку компиляции:

object ElemHelper {
  def unapply(n: Node): Option[(String, String, scala.xml.MetaData, scala.xml.NamespaceBinding, Seq[scala.xml.Node])] = Elem.unapplySeq(n)
}

val rule1 = new RewriteRule {
    override def transform(n: Node): Seq[Node] = n match {
        case ElemHelper(prefix, "PC", attribs, scope, minimizeEmpty, content @ _*)  => 
            Elem(prefix, "Mac", attribs, scope, true, content:_*)
        case other => other
    }       
}

// <console>:16: error: wrong number of arguments for object ElemHelper

Я создал отчет об ошибке.

person senia    schedule 28.06.2013