Ich mache Matching gegen einige Fallklassen und möchte zwei der Fälle auf die gleiche Weise behandeln. Etwas wie das:
abstract class Foo
case class A extends Foo
case class B(s:String) extends Foo
case class C(s:String) extends Foo
def matcher(l: Foo): String = {
l match {
case A() => "A"
case B(sb) | C(sc) => "B"
case _ => "default"
}
}
Aber wenn ich das mache, bekomme ich den Fehler:
(fragment of test.scala):10: error: illegal variable in pattern alternative
case B(sb) | C(sc) => "B"
Ich kann es zum Laufen bringen, indem ich die Parameter aus der Definition von B und C entferne, aber wie kann ich mit den Parametern übereinstimmen?
scala
pattern-matching
timdisney
quelle
quelle
case A(x) | B(x) => println(x)
erlaubt zu sein, wenn der Typ vonx
im Typensystem von A (x) und B (x) auf die Obergrenze gesetzt wird.Es gibt mehrere Möglichkeiten, wie ich sehen kann, was Sie suchen, wenn Sie Gemeinsamkeiten zwischen Fallklassen haben. Die erste besteht darin, dass die Fallklassen ein Merkmal erweitern, das die Gemeinsamkeit deklariert, und die zweite darin, einen Strukturtyp zu verwenden, der die Notwendigkeit beseitigt, Ihre Fallklassen zu erweitern.
Die strukturelle Typmethode generiert eine Warnung vor dem Löschen, die ich derzeit nicht sicher beseitigen kann.
quelle
Nun, es macht nicht wirklich Sinn, oder? B und C schließen sich gegenseitig aus, sodass entweder sb oder sc gebunden werden, aber Sie wissen nicht, welche. Daher benötigen Sie eine weitere Auswahllogik, um zu entscheiden, welche verwendet werden soll (vorausgesetzt, sie sind an eine Option [String] gebunden, nicht ein Faden). Daraus wird also nichts gewonnen:
Oder dieses:
quelle
args match { case Array("-x", hostArg) => (hostArg, true); case Array(hostArg, "-x") => (hostArg, true) }
Ich sehe jedoch, dass dies nicht der übliche Fall ist und dass das Erstellen einer lokalen Methode eine Alternative ist. Wenn die Alternative jedoch zweckmäßig ist, macht es wenig Sinn, Fallalternativen zu haben. Tatsächlich haben Sie in einigen ML-Dialekten eine ähnliche Funktion und können weiterhin Variablen binden, solange (IIRC) jede Variable bei beiden Alternativen mit demselben Typ gebunden ist.