2013-04-19 13 views
5

In Scala 2.10, ist someDouble.isNaN Box erwartet? Wenn ich meinen Code lese, der .isNaN durch einen Decompiler aufruft, sehe ich immer noch verräterische Aufrufe an double2Double in meinem Code. Angesichts der neuen AnyVal Arbeit in 2.10, würde ich erwarten, dass es nicht schlechter als zur Laufzeit ohne störende Zuordnungen ist. Fehle ich etwas?Scala 2.10, Double.isNaN und Boxen

Antwort

6

Leider ist isNaN ein Verfahren auf java.lang.Double, und es ist wichtig, eine implizite Konvertierung zu java.lang.Double haben, so dass der Scala RichDouble Wertklasse nicht isNaN schnell sein reimplementieren können, und wenn Sie isNaN Sie Kasten zu java.lang.Double.

Da dies nur langsam oder umständlich Wege verlässt für NaN zu testen, definiere ich

implicit class RicherDouble(val d: Double) extends AnyVal { 
    def nan = java.lang.Double.isNaN(d) 
} 

und dann kann ich nur .nan verwenden zu überprüfen.

+0

Warum sollte das schneller sein als das Double? – gzm0

+3

@ gzm0 - Weil diese "Boxen" zu einer Wertklasse (das ist der "AnyVal" Teil erweitert), die nicht wirklich erstellt wird, es sei denn, Sie müssen es als Objekt oder Generic übergeben oder in ein Array einfügen. Wenn Sie es nur benutzen (wie Sie hier sind), sendet Scala einen Bytecode aus, der nur ein Methodenaufruf ist, da es eigentlich nichts gibt, was die Existenz eines realen Objekts erfordert. –

+0

Könnte es nicht eine höhere Priorität für Ihr 'RicherDouble' geben, mit demselben' isNaN' Namen? Oder wenn nicht, etwas mit der gleichen Priorität mit Zweideutigkeit versagen, um sich daran zu erinnern, diese Methode nicht in engen Schleifen zu verwenden. –

Verwandte Themen