Im Beispiel unten, in der zweiten case
würde ich den gleichen Kompilierungsfehler wie in der ersten case
erwarten, aber es kompiliert. Warum?Warum kann ich im scala-Match einen unmöglichen Fall haben?
object CaseMatching extends App {
case class Id(value: Long)
object Id { val zero = Id(0) }
case class Name(value: String)
case class IdName(id: Id, name: Name)
IdName(Id(0), Name("A")) match {
case IdName(_, Id(0) ) => // does not compile (as expected)
case IdName(_, Id.zero) => // does compile (but should not ?)
case IdName(Id.zero, _) => println("OK") // this is OK and will match
case _ =>
}
}
Warum ist das relevant? - Ich brauchte den größten Teil einer Stunde, um herauszufinden, warum der folgende Fall nie erfüllt wurde: case TreeEntry(_, Some(child), _, _, NodeType.DIR, _, _)
Das war, weil der NodeType im 4. Feld und nicht im 5. Feld ist. Ich hätte es geschätzt, wenn der Compiler es mir gesagt hätte!
Ich habe versucht zu machen Null eine Kompilierung konstant, zum Beispiel 'final val Null = Id (0)' aber es würde immer noch kompilieren. Was ist der Unterschied zwischen diesem Fall und der einfachen Übergabe von "Id (0)"? Können Sie einen Hinweis geben, wie Sie Fehler vermeiden können? – stoyanr
@stoyanr fügte die korrekte Antwort hinzu. –
@stoyanr hat die kürzeste Antwort mit Link zum Problem hinzugefügt. Ihr Kommentar: Id (0) ist keine Konstante, daher ändert Ihre Syntax nichts. –