2013-04-19 18 views
5

Scala 2.10'da kutunun olması beklenen someDouble.isNaN mu? Kodumda bir decompiler aracılığıyla .isNaN numaralı çağrıyı çalıştırıyorum, hala koduma double2Double numaralı telefona sesli aramalar görüyorum. Yeni AnyVal'un 2.10'da çalıştığı düşünülürse, hiç bir zaman yanlış tahsisi olmaksızın java.lang.Double.isNaN(someDouble)'dan daha kötü olmayacağını umuyorum. Bir şey mi eksik?Scala 2.10, Double.isNaN ve boks

cevap

6

Maalesef isNaNjava.lang.Double bir yöntemdir, ve Scala RichDouble değer sınıfı hızlı olmasını isNaN reimplement edemez yüzden, java.lang.Double bir örtük dönüştürme olması esastır ve kullandığınız zaman isNaN sen java.lang.Double kutusundaki. Bu NaN test etmek için sadece yavaş veya garip yollar bırakır yana

, ben

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

tanımlamak ve sonra sadece kontrol etmek .nan kullanabilirsiniz.

+0

Bu neden çiftleri boks yapmaktan daha hızlı olmalı? – gzm0

+3

@ gzm0 - Çünkü bu "kutuları" bir değer sınıfına (yani 'AnyVal' parçasını genişletir), aslında bir nesne veya jenerik olarak geçirmeniz veya bir diziye koymanız gerekmedikçe yaratılmaz. Eğer onu kullanırsanız (buradaysanız), Scala gerçek bir nesnenin var olmasını gerektirecek bir şey olmadığı için sadece bir yöntem çağrısı olan bayt kodu çıkarır. –

+0

"RicherDouble" öğeniz için daha yüksek öncelikli bir örtük olamaz, aynı "isNaN" ismiyle birlikte olamaz mı? Ya da değilse, aynı önceliğe sahip bir şey, bu yöntemi sıkı döngülerde kullanmamanızı hatırlatmak için belirsizlikle başa çıkamaz. –