In Scala, warum NaN nicht abgeholt wird durch pattern-matching?
Meine Methode ist wie folgt
def myMethod(myDouble: Double): Double = myDouble match {
case Double.NaN => ...
case _ => ...
}
Den IntelliJ-debugger zeigt NaN aber das ist nicht abgeholt wird, die in mein Suchmuster. Gibt es mögliche Fälle bin ich das weglassen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine Allgemeine Regel, wie 64-bit-floating-point-zahlen sind im Vergleich nach IEEE 754 (nicht Scala oder auch Java verwandt, siehe NaN):
Die Idee ist, dass
NaN
ist ein marker mit dem Wert für unbekannt oder unbestimmten. Vergleich von zwei unbekannten Werte sollten immer Erträgefalse
wie Sie sind gut... unbekannt.Wenn Sie möchten, verwenden Sie pattern-matching mit
NaN
, versuchen Sie dies:Aber ich denke, pattern-matching verwenden strenge Doppel-Vergleich also seien Sie vorsichtig mit diesem Konstrukt.
NaN != NaN
in vielen (wenn nicht allen) Programmiersprachen, setzen Sie diesen Wert auf die Programmierer..isNaN
ist nur etwa halb so schnell wiejava.lang.Double.isNaN
, so dass die letztere bevorzugt werden sollten, in engen loops. (Das Spiel ist so schnell wie eine if-Anweisung.) Für Klarheit (d.h. überall außer in engen performance-kritischen loops), die.isNaN
form ist wahrscheinlich am besten.Schreiben Sie einen extractor (aktualisiert nach bse-Kommentar):
object NaN { def unapply(d:Double) = d.isNaN }
. Es kann z.B. so verwendet werden:0.0/0.0 match { case NaN() => print("NaN") }
Tomasz korrekt ist. Sollten Sie verwenden
isNaN
statt.