Ho il seguente codice:Scala "non prende i parametri" quando pattern-corrispondenza parametrica caso classe
sealed trait A
case class B[T](v: T) extends A
case class C[T](v: T) extends A
object Test {
def swap(a: A): A = a match {
case a: B[t] => C[t](a.v) // works!
case C[t](v) => B[t](v) // error: C[t] does not take parameters
}
}
mi si aspetterebbe entrambi entrambi i casi di fallire o di entrambi al lavoro. Qual è il significato dell'errore per il secondo caso? Esiste una case history parametrica destrutturante della sintassi?
Nota: qui, 't' in minuscolo è essenziale. Se fosse "T", il controllore lo cercerebbe nei parametri tipo del metodo.
Questo è anche il caso quando si esegue l'estrazione per vals, cioè 'val C [T] (v) = ...' – ggovan
Giusto per essere sicuro di capire il codice ... si sta usando 't' per rappresentare un tipo? Quando per convenzione i tipi sono rappresentati con una lettera maiuscola iniziale? E, per confondere ulteriormente, stai usando il parametro 'v' per mantenere il valore per l'argomento' v'? Per favore, rendi il tuo codice un po 'meno ... autoreferenziale. –
@BobDalgleish: L'uso di una lettera maiuscola per il tipo causerebbe un errore qui, e l'utilizzo del collegamento 'v' a' a.v' non mi sembra così terribile. –