In realtà, il fatto che :: è una classe di casi è solo la metà della risposta. Il motivo per cui questo funziona nella corrispondenza dei modelli è che esiste un estrattore per object ::, che viene generato automaticamente quando viene definita una classe case. Convenientemente, ::. Unpply restituisce una lista, perché :: estende l'elenco. Se si desidera utilizzare lo stesso trucco per gli elenchi, tuttavia, non sarà possibile estendere l'elenco, poiché è finale. Quello che puoi fare è definire un oggetto con il metodo Unpply appropriato, che ha la firma di ritorno prevista. Per esempio, per abbinare il ultima elemento di una lista, si può fare:
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!"
}
L'estrattore deve restituire un opzione, che contiene una tupla di due elementi decostruiti.
Duplicato di http://stackoverflow.com/questions/1059145/how-is-this-case-class-match-pattern-working, veramente. –
la mia domanda non riguardava solo il modo in cui '::' è tra le variabili, ma anche il modo in cui una classe case può eguagliare istanze di un'altra classe (la ragione è che List # :: crea istanze di :: case class) – IttayD