스칼라가 unapply
과 unapplySeq
을 모두 갖는 이유는 무엇입니까? 둘의 차이점은 무엇입니까? 언제 다른 쪽을 선호합니까?unapply와 unapplySeq의 차이점은 무엇입니까?
33
A
답변
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
감사합니다. 그건 의미가 있습니다. 하스켈의 관점에서 보았을 때,'List (a, b, c)'를'a :: b :: c :: Nil'에 일치하는 것으로 생각했지만, 스칼라는 그렇게하지 않는다. 대신'List'의'unapplySeq' 메소드를 사용합니다. –
이 답변에 언급 된 논문은 다음에서 찾을 수 있습니다. http://www.michaelrueegg.name/static/papers/PatternMatchingInScala.pdf –
@dan Scala는 다음에 적용 할 수없는 방법을 사용하여 원하는 방식으로 목록에서 일치시킬 수 있습니다. : 동반자 개체. 예상대로이 unapply 그냥 머리글과 꼬리로 목록 (또는 오히려 :) : destructures. 이 기능은 목록에서만 작동하며 Seq에서는 작동하지 않습니다. –