List 理解列表上的模式匹配

List 理解列表上的模式匹配,list,scala,pattern-matching,extractor,List,Scala,Pattern Matching,Extractor,我最近一直在玩提取器,想知道列表提取器是如何工作的,尤其是: List(1, 2, 3) match { case x :: y :: z :: Nil => x + y + z // case ::(x, ::(y, ::(z , Nil))) } Ok::在模式中使用,所以我猜编译器现在会在::-对象中查找unapply方法。所以我试过这个: scala> (::).unapply(::(1, ::(2, Nil))) res3: Option[(Int, List[Int

我最近一直在玩提取器,想知道列表提取器是如何工作的,尤其是:

List(1, 2, 3) match {
  case x :: y :: z :: Nil => x + y + z // case ::(x, ::(y, ::(z , Nil)))
}
Ok::在模式中使用,所以我猜编译器现在会在::-对象中查找unapply方法。所以我试过这个:

scala> (::).unapply(::(1, ::(2, Nil)))
res3: Option[(Int, List[Int])] = Some((1,List(2)))
很好,很管用。但是,这并不是:

scala> (::).unapply(List(1,2,3))      
<console>:6: error: type mismatch;
 found   : List[Int]
 required: scala.collection.immutable.::[?]
       (::).unapply(List(1,2,3))

实际上我现在有点困惑。编译器如何在此处选择unapply的正确实现。

Match主要执行以下操作:

(::).unapply(List[Int](1,2,3).asInstanceOf[::[Int]])

一旦它知道它是安全的(因为<代码>列表(1,2,3)。isInstanceOf[:[Int]]是<代码>真的)。

编译器会尝试这样做,因为::是列表的子类型吗?更新:啊,我想我明白了。^。@raichoo-它尝试了,因为你在模式中要求
。是的,尽管如此。谢谢你澄清:)
(::).unapply(List[Int](1,2,3).asInstanceOf[::[Int]])