为什么Scala同时具有unapply
和unapplySeq
?两者有什么区别?我什么时候比另一个更喜欢?
最佳答案
无需赘述和简化:
对于常规参数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
。关于scala - unapply和unapplySeq有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8282277/