afin de mettre à jour un enfant sur un noeud XML, vous pouvez le faire (autre ref SO ticket manquant ici):Comment faire correspondre le cas undeprecated appliquer méthode de scala.xml.Elem
val node:Node = <item><category>1</category></item>
val root = node match {
case Elem(p,l,a,s, child @ _*) ⇒ Elem(p,l,a,s,child.filter(_.label != "category") ++ <category>2</category>:_*)
case _ ⇒ node // error case
}
Cette donne un avertissement dépréciée, comme on doit utiliser la méthode Elem avec désignation explicite de minimizeEmpty
comme 5ème paramètre:
val node:Node = <item><category>1</category></item>
val root = node match {
case Elem(p,l,a,s,m,child @ _*) ⇒ Elem(p,l,a,s,m,child.filter(_.label != "category") ++ <category>2</category>:_*)
case _ ⇒ node // error case
}
Cela ne fonctionne pas, car il applique toujours la Deconstructing de la méthode apply sans paramètre booléen explicite, par conséquent m
obtient toujours le type Node
et rien ne convient.
Alors, comment puis-je aider le compilateur à sélectionner la bonne méthode Constructor/apply? (Scala 2.12.1)
ne fonctionne pas:
case Elem(p,l,a,s,m:Boolean,child @ _*)
case Elem(p,l,a,s,m @(_:Boolean),child @ _*)
case Elem(p,l,a,s,m @Boolean,child @ _*)
me disent que m doit être Node
Cette dernière solution est presque ce que j'ai utilisé, merci pour cette amélioration. Quand j'ai lu votre réponse correctement, c'est un bug/défaut dans Scala? J'ai été témoin de cela auparavant avec des fonctions surchargées où l'on avait un paramètre '*'? – Jan
@Jan Bonne question. J'ai répondu en ajoutant un autre paragraphe à la réponse ci-dessus. – ashawley
notre belle solution avec 'e @ Elem ...' ne fonctionne pas, quand le type de 'node' est en fait' Node' ... Donc je m'en tiens à ma variante 'node.asInstanceOf [Elem] .minimizeEmpty' :) – Jan