2013-04-19 14 views
5

W Scala 2.10, czy someDouble.isNaN oczekuje się na pudełko? Uruchamiając mój kod wywołując .isNaN za pośrednictwem dekompilatora, nadal widzę sygnalizujące wywołania do double2Double w moim kodzie. Biorąc pod uwagę nowe działanie AnyVal w wersji 2.10, spodziewałbym się, że nie będzie gorszy niż java.lang.Double.isNaN(someDouble) w środowisku wykonawczym bez żadnych fałszywych alokacji. Czy czegoś brakuje?Scala 2.10, Double.isNaN i boks

Odpowiedz

6

Niestety isNaN to metoda na java.lang.Double, i ważne jest, aby mieć niejawna konwersja do java.lang.Double, więc klasa wartość Scala RichDouble nie może reimplement isNaN być szybki, a podczas korzystania isNaN Boxem do java.lang.Double.

Ponieważ ta pozostawia jedynie spowolnić lub niewygodnych sposobów test dla NaN, zdefiniować

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

i wtedy można po prostu użyć .nan sprawdzić.

+0

Dlaczego to powinno być szybsze niż boksowanie podwójne? – gzm0

+3

@ gzm0 - Ponieważ to "pola" do klasy wartości (to jest część 'extends AnyVal'), która nie jest faktycznie tworzona, chyba że musisz przekazać ją jako obiekt lub ogólny lub umieścić w tablicy. Jeśli po prostu go użyjesz (tak jak tu jesteś), Scala emituje kod bajtowy, który jest po prostu wywołaniem metody, ponieważ w rzeczywistości nic nie wymaga istnienia realnego obiektu. –

+0

Nie może istnieć wyższy priorytet dla twojego 'RicherDouble', z tą samą nazwą' isNa' na nim? Lub jeśli nie, coś o tym samym priorytecie, aby zawieść z niejednoznacznością, aby przypomnieć sobie, aby nie używać tej metody w ciasnych pętlach. –

Powiązane problemy