He estado jugando con Extractores últimamente y se preguntaba cómo los extractores de lista de trabajos especialmente esto:patrón de entendimiento a juego en las listas
List(1, 2, 3) match {
case x :: y :: z :: Nil => x + y + z // case ::(x, ::(y, ::(z , Nil)))
}
Ok :: se utiliza en el patrón, así que supongo que el compilador ahora busca el método de aplicación en el :: - Objeto. Así que intenté esto:
scala> (::).unapply(::(1, ::(2, Nil)))
res3: Option[(Int, List[Int])] = Some((1,List(2)))
Nice that works. Sin embargo, esto no es así:
scala> (::).unapply(List(1,2,3))
<console>:6: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.::[?]
(::).unapply(List(1,2,3))
mientras que esto hace:
scala> List.unapplySeq(List(1,2,3))
res5: Some[List[Int]] = Some(List(1, 2, 3))
En realidad estoy un poco desconcertado por el momento. ¿Cómo elige el compilador la implementación correcta de una aplicación aquí?
Y el compilador prueba esto porque :: es un subtipo de la lista? Actualización: Ah, creo que lo entiendo ^^. – raichoo
@raichoo - Lo intenta porque pides '::' en el patrón. –
Sí, aunque sí. Gracias por aclarar eso :) – raichoo