【发布时间】:2016-03-29 08:49:54
【问题描述】:
我有一个关于通过 scala 中的模式匹配进行分配的问题。假设我有以下内容:
a. Seq.unapplySeq(List(1))
b. val Seq(z) = List(1)
c. val c = List(1) match {
case Seq(e) => e
}
d. List.unapplySeq(Seq(1))
e. val List(a) = Seq(1)
f. val b = Seq(1) match {
case List(e) => e
}
只有 (d) 不编译,其他编译运行正常。
我知道 List 的 unapplySeq 在 SeqFactory 中定义为:
abstract class SeqFactory[CC[X] <: Seq[X] with GenericTraversableTemplate[X, CC]] extends GenSeqFactory[CC] with TraversableFactory[CC] {
applySeq[A](x: CC[A]): Some[CC[A]] = Some(x)
}
因为 CC 是 List,所以 (d) 中的 Seq 不会进行类型检查。
似乎 (a)、(b) 和 (c) 在一组中,而 (d)、(e) 和 (f) 在另一组中。
在我的理解中,(f) 的破坏实际上会调用 (d),因为 (f) 中的模式匹配所做的是使用 List 来破坏 Seq(1)。
我的问题是为什么 (e) 和 (f) 在 (d) 无法编译的情况下仍然正确。
【问题讨论】: