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
5
A
cevap
6
Maalesef isNaN
java.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.
Bu neden çiftleri boks yapmaktan daha hızlı olmalı? – gzm0
@ 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. –
"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. –