Übernehmen Sie die folgende Funktion:
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
Dieses Muster passt gut:
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
Was ich tun möchte, ist Folgendes:
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
Dies gibt den folgenden Fehler aus:
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
Ich denke, das liegt daran, dass das Ziel tatsächlich ein Name ist, den Sie der Eingabe zuweisen möchten. Zwei Fragen:
Warum dieses Verhalten? Können Sie nicht einfach nach vorhandenen Variablen im Gültigkeitsbereich suchen, die den entsprechenden Typ haben, und diese zuerst verwenden. Wenn keine gefunden werden, behandeln Sie das Ziel als einen Namen, über den das Muster abgeglichen werden soll.
Gibt es eine Problemumgehung dafür? Gibt es eine Möglichkeit, Muster mit Variablen abzugleichen? Letztendlich könnte man eine große if-Aussage gebrauchen, aber der Matchcase ist eleganter.