2011-11-26 5 views

답변

26

:

object M { 
    def apply(a: A*): M = ......... // makes a M from an As. 
    def unapplySeq(m: M): Option[Seq[A]] = ... // retrieve the As from the M 
} 
val m = M(a1, a2, a3) 
m match { case M(a1, a2, a3) => ... } 
m match { case M(a, as @ _*) => ... } 

두 번째 경우 반복 매개 변수는 Seq과 유사하고 A*_* 사이의 유사성으로 처리됩니다.

자연스럽게 다양한 단일 값이 포함 된 것을 구조화 해제하려면 unapply을 사용하십시오. Seq이 포함 된 것을 구조화 해제하려면 unapplySeq을 사용하십시오.

18

고정 인수 대 가변 인수. Pattern Matching in Scala (pdf)은 미러링 예제로 잘 설명합니다. this answer에도 미러링 예제가 있습니다.

간단히 : 그래서

object Sorted { 
    def unapply(xs: Seq[Int]) = 
    if (xs == xs.sortWith(_ < _)) Some(xs) else None 
} 

object SortedSeq { 
    def unapplySeq(xs: Seq[Int]) = 
    if (xs == xs.sortWith(_ < _)) Some(xs) else None 
} 

scala> List(1,2,3,4) match { case Sorted(xs) => xs } 
res0: Seq[Int] = List(1, 2, 3, 4) 
scala> List(1,2,3,4) match { case SortedSeq(a, b, c, d) => List(a, b, c, d) } 
res1: List[Int] = List(1, 2, 3, 4) 
scala> List(1) match { case SortedSeq(a) => a } 
res2: Int = 1 

, 당신은 다음의 예에 전시되어 생각하십니까? 반복 매개 변수의

object S { 
    def apply(a: A):S = ... // makes a S from an A 
    def unapply(s: S): Option[A] = ... // retrieve the A from the S 
} 
val s = S(a) 
s match { case S(a) => a } 

, apply 구조 및 unapplySeq 드 구조 : 일반 매개 변수 apply 구조 및 unapply 드 구조에 대해서는

: 약간의 세부 사항에 가서 간단없이

scala> List(1) match { case List(x) => x } 
res3: Int = 1 
+0

감사합니다. 그건 의미가 있습니다. 하스켈의 관점에서 보았을 때,'List (a, b, c)'를'a :: b :: c :: Nil'에 일치하는 것으로 생각했지만, 스칼라는 그렇게하지 않는다. 대신'List'의'unapplySeq' 메소드를 사용합니다. –

+0

이 답변에 언급 된 논문은 다음에서 찾을 수 있습니다. http://www.michaelrueegg.name/static/papers/PatternMatchingInScala.pdf –

+1

@dan Scala는 다음에 적용 할 수없는 방법을 사용하여 원하는 방식으로 목록에서 일치시킬 수 있습니다. : 동반자 개체. 예상대로이 unapply 그냥 머리글과 꼬리로 목록 (또는 오히려 :) : destructures. 이 기능은 목록에서만 작동하며 Seq에서는 작동하지 않습니다. –