9

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

List(1, 2, 3) match {
  case x :: y :: z :: Nil => x + y + z // case ::(x, ::(y, ::(z , Nil)))
}

Ok :: 在模式中使用,所以我猜编译器现在在 ::-Object 中查找 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))

虽然这样做:

scala> List.unapplySeq(List(1,2,3))
res5: Some[List[Int]] = Some(List(1, 2, 3))

其实我现在有点疑惑。编译器如何在这里选择正确的 unapply 实现。

4

1 回答 1

9

Match基本上是在做以下事情:

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

一旦它知道它是安全的(因为List(1,2,3).isInstanceOf[::[Int]]is true)。

于 2011-02-28T20:30:41.797 回答