为什么Scala同时具有unapplyunapplySeq?两者有什么区别?我什么时候比另一个更喜欢?

最佳答案

无需赘述和简化:

对于常规参数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/

10-16 02:04