En realidad, el hecho de que :: es una clase de caso es solo la mitad de la respuesta. La razón por la que esto funciona en la coincidencia de patrones es que existe un extractor para object ::, que se genera automáticamente cuando se define una clase de caso. Convenientemente, ::. Unapply devuelve una lista, porque :: extends List. Sin embargo, si desea utilizar el mismo truco para Listas, no podrá extender la Lista, porque es final. Lo que puede hacer es definir un objeto con el método apropiado de aplicación, que tiene la firma de devolución esperada. Por ejemplo, para que coincida con la última elemento de una lista, que puede hacer:
object ::> {def unapply[A] (l: List[A]) = Some((l.init, l.last))}
List(1, 2, 3) match {
case _ ::> last => println(last)
}
(1 to 9).toList match {
case List(1, 2, 3, 4, 5, 6, 7, 8) ::> 9 => "woah!"
}
(1 to 9).toList match {
case List(1, 2, 3, 4, 5, 6, 7) ::> 8 ::> 9 => "w00t!"
}
El extractor debe devolver una opción, que contiene una tupla de los dos elementos de la deconstrucción.
Duplicado de http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-workwork-working, De Verdad. –
mi pregunta no era solo por qué '::' se encuentra entre las variables, sino también cómo una clase case puede coincidir con instancias de otra clase (la razón es que List # :: crea instancias de :: case class) – IttayD