Mam następujący kod:Scala „nie bierze parametry”, gdy wzorzec-parametrycznego dopasowania case-klasa
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
}
}
spodziewałbym albo oba przypadki na niepowodzenie lub obu z nich do pracy. Jakie jest znaczenie błędu w drugim przypadku? Czy istnieją parametryczne klasy przypadków destrukcji składni?
Uwaga: W tym przypadku kluczowe znaczenie ma "t". Jeśli był to "T", sprawdzający szukałby go w parametrach typu metody.
Jest tak również w przypadku wyodrębniania dla vals, tj. 'Val C [T] (v) = ...' – ggovan
Tylko po to, aby upewnić się, że rozumiem twój kod ... używasz 't' do reprezentowania typ? Kiedy według konwencji typy są reprezentowane początkową wielką literą? I, aby jeszcze bardziej zmylić, używasz parametru 'v' do przechowywania wartości dla argumentu' v'? Proszę, spraw, żeby twój kod był trochę mniej ... samoodnoszący się. –
@BobDalgleish: Użycie dużej litery dla tego typu spowoduje błąd tutaj, a użycie wiązania 'v' do' a.v' nie wydaje mi się tak straszne. –