Не вдаваясь в детали и немного упрощая:
Для обычных параметров apply
конструкции и unapply
деструктуры:
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
де-структуры:
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
.