Ü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.
scala
pattern-matching
match
Henry Henrinson
quelle
quelle
Antworten:
Was Sie suchen, ist eine stabile Kennung . In Scala müssen diese entweder mit einem Großbuchstaben beginnen oder von Backticks umgeben sein.
Beides wäre eine Lösung für Ihr Problem:
Um zu vermeiden, dass versehentlich auf Variablen verwiesen wird, die bereits im umschließenden Bereich vorhanden waren, ist es meines Erachtens sinnvoll, dass das Standardverhalten darin besteht, dass Kleinbuchstaben Variablen und keine stabilen Bezeichner sind. Nur wenn Sie etwas sehen, das mit Großbuchstaben beginnt, oder in Häkchen, müssen Sie sich bewusst sein, dass es aus dem umgebenden Bereich stammt.
quelle
target
ein Wert (val
) und keine Variable (var
) ist. Es funktioniert nicht mit Variablen.Nil
, was ich wette, ist der wahre Grund.this
stabile Kennung verwenden, um eine Übereinstimmung mit dem Muster zu erzielen. Es scheint nur so, als würde man einen Gleichstellungsschutz wie verwendencase x if x == this =>
. Wahrscheinlich eine syntaktische Einschränkung, sonst sollte es zumindest innerhalb vonobject
s semantisch funktionieren .