Что такое сопоставление шаблонов в списках

Я в последнее время играл с экстракторами и интересовался, как работают экстракторы списков, особенно это:

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

Ok :: используется в шаблоне, поэтому я предполагаю, что компилятор теперь ищет метод неприменения в :: - Object. Итак, попробовал это:

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 здесь.

9
задан tshepang 7 March 2014 в 19:36
поделиться