В последнее время я играл с экстракторами, и мне было интересно, как работают экстракторы списков, особенно это:
List(1, 2, 3) match {
case x :: y :: z :: Nil => x + y + z // case ::(x, ::(y, ::(z , Nil)))
}
Ok :: используется в шаблоне, поэтому я предполагаю, что компилятор теперь ищет метод неприменения в объекте :: -. Итак, попробовал это:
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))
На самом деле, я сейчас немного озадачен. Как компилятор выбирает правильную реализацию здесь не применимо.