Ist es möglich, einen Vergleich mit dem Mustervergleichssystem in Scala durchzuführen? Beispielsweise:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
Die zweite case-Anweisung ist illegal, aber ich möchte angeben können, "wann a größer als" ist.
scala
pattern-matching
Passend zum Satz
quelle
quelle
case x if x.size > 2 => ...
Antworten:
Sie können
if
nach dem Muster einen Schutz hinzufügen, dh einen und einen booleschen Ausdruck:Bearbeiten: Beachten Sie, dass dies mehr als nur oberflächlich anders ist als das Setzen eines
if
Nach dem=>
, da ein Muster nicht übereinstimmt, wenn der Schutz nicht wahr ist.quelle
Als Nichtantwort auf den Geist der Frage, der fragte, wie Prädikate in eine Übereinstimmungsklausel aufgenommen werden sollen, kann das Prädikat in diesem Fall vor dem
match
:Nun verspricht die Dokumentation
scala.math.Ordering.compare(T, T)
nur, dass die ungleichen Ergebnisse größer oder kleiner als Null sein werden . JavaComparable#compareTo(T)
wird ähnlich wie Scala spezifiziert. Es ist üblich, 1 und -1 für die positiven bzw. negativen Werte zu verwenden, wie dies bei der aktuellen Implementierung von Scala der Fall ist, aber man kann eine solche Annahme nicht treffen, ohne dass das Risiko besteht, dass sich die Implementierung von unten ändert.quelle
compare()
undcompareTo()
geben Sie nicht 0, 1 und -1 als Codomäne an.Eine Lösung, die meiner Meinung nach viel besser lesbar ist als das Hinzufügen von Wachen:
Anmerkungen:
Ordered.compare
Gibt eine negative Ganzzahl zurück, wenn diese kleiner als diese ist, positiv, wenn größer und0
wenn gleich.Int.signum
Komprimiert die Ausgabe voncompare
bis-1
für eine negative Zahl (kleiner als 10),1
für eine positive Zahl ( größer als 10) oder0
für Null (gleich 10).quelle
Alle oben genannten und nachstehenden Antworten beantworten die ursprüngliche Frage perfekt. Einige zusätzliche Informationen finden Sie in der Dokumentation https://docs.scala-lang.org/tour/pattern-matching.html . Sie passten jedoch nicht in meinen Fall Da diese Stackoverflow-Antwort jedoch der erste Vorschlag in Google ist, möchte ich meine Antwort veröffentlichen, die ein Eckfall der obigen Frage ist.
Meine Frage ist:
Was umschrieben werden kann:
Die Antwort ist das folgende Codebeispiel:
Link zur Scala Geige: https://scalafiddle.io/sf/G37THif/2 Wie Sie sehen können, kann die
case xs if n <= 0 => xs
Anweisung n (Argument einer Funktion) mit der guard (if) -Anweisung verwenden.Ich hoffe das hilft jemandem wie mir.
quelle