2011-02-28 13 views
9

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í?

Respuesta

9

partido está haciendo básicamente lo siguiente:

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

una vez que se sabe que es seguro (porque es List(1,2,3).isInstanceOf[::[Int]]true).

+0

Y el compilador prueba esto porque :: es un subtipo de la lista? Actualización: Ah, creo que lo entiendo ^^. – raichoo

+1

@raichoo - Lo intenta porque pides '::' en el patrón. –

+0

Sí, aunque sí. Gracias por aclarar eso :) – raichoo

Cuestiones relacionadas