2017-09-29 2 views
1

의 undeprecated 적용-방법과 일치하는 방법 :(여기없는 다른 SO-티켓 REF)이 작업을 수행 할 수있는 XML 노드에 아이 업데이트하기 위해 케이스를 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 
} 

이를 하나는 5 매개 변수로 minimizeEmpty의 명시 적 이름으로 Elem 모델 방법을 사용해야로, 사용되지 않는 경고를 제공합니다 : 항상 명시 적 부울 매개 변수없이 적용 방법의 해체를 적용되는

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 
} 

이것은 그러나, 작동하지 않습니다, 따라서 m은 항상 유형을 얻습니다. Node와 아무 것도 맞지 않습니다.

그렇다면 컴파일러가 올바른 생성자/적용 방법을 선택하도록 어떻게 도와 드릴까요? (스칼라 2.12.1)

작동하지 :

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 @ _*) 

모든의는 방법을 적용 객체

답변

1

당신이 중단 경고 보면, 그것은 동반자입니다 그 m는 노드 수 있어야 말해, 및 하지 패턴 일치 생성자 : 단지 @와 변수 바인딩 매개 변수를 사용하려면

> set scalacOptions += "-deprecation" 
> console 
scala> import scala.xml._ 

scala> val node:Elem = <item><category>1</category></item> 

scala> node match { 
     case Elem(p,l,a,s, child @ _*) ⇒ Elem(p,l,a,s,child.filter(_.label != "category") ++ <category>2</category>:_*) 
     } 
<console>:17: warning: method apply in object Elem is deprecated: Use the other apply method in this object 
    case Elem(p,l,a,s, child @ _*) ⇒ Elem(p,l,a,s,child.filter(_.label != "category") ++ <category>2</category>:_*) 
           ^

그것은 유용 할 수 있습니다 :

scala> node match { 
    | case e @ Elem(p,l,a,s, child @ _*) ⇒ Elem(p,l,a,s,e.minimizeEmpty,child.filter(_.label != "category") ++ <category>2</category>:_*) 
    | } 
res1: scala.xml.Elem = <item><category>2</category></item> 

Elem에 대한 패턴 일치가 약간 놀랍습니다. 어떤 이유로 Elemapply 메서드를 사용하여 2007 년에 사례 클래스에서 동반자 개체로 변환되었습니다. 2012 년 두 번째 apply 메서드가 추가되었으며 첫 번째는 사용되지 않습니다.

스칼라의 함수는 varargs를 지원하며 잘 작동합니다. 스칼라의 케이스 클래스도 varargs를 지원합니다. 이 경우, 이것은 varargs를 사용하는 apply 메쏘드로 이루어지며, 두 개가 있습니다. 컴파일러는 복수 apply 메소드의 사용을 지원하지만, 어떻게 varargs와 상호 작용하면 패턴 일치가 어려울 수 있습니다. scala-xml 관리자가 새로운 매개 변수를 추가하는 두 번째 적용 메소드를 추가 할 때 패턴 매칭과 관련하여 변경 사항의 영향을 이해했다고 생각하지 않습니다.

+0

후자의 솔루션은 내가 사용했던 것과 거의 같습니다. 귀하의 답변을 올바르게 읽었을 때 이것은 스칼라의 버그/결함입니까? 이전에 오버로드 된 함수에서'*'- 매개 변수가있는 곳에서 목격했습니다. – Jan

+1

@Jan 좋은 질문입니다. 위의 답변에 다른 단락을 추가하여 답변했습니다. – ashawley

+0

'e @ Elem ... '이있는 좋은 해결책은'node'의 타입이 실제로'Node' 일 때 작동하지 않습니다 ... 그래서 나는'node.asInstanceOf [Elem] .minimizeEmpty' 변형을 고수합니다 : – Jan

관련 문제