2013-04-19 11 views
5

स्कैला 2.10 में, someDouble.isNaN बॉक्स से अपेक्षित है? मेरे कोड को .isNaN पर एक डिकंपेलर के माध्यम से कॉल करना, मैं अभी भी अपने कोड में double2Double पर बताता हूं। 2.10 में नए AnyVal काम को देखते हुए, मुझे उम्मीद है कि यह java.lang.Double.isNaN(someDouble) से रनटाइम पर कोई भी नकली आवंटन नहीं होगा। क्या मैं कुछ भूल रहा हूँ?स्कैला 2.10, डबल.इसएनएएन, और मुक्केबाजी

उत्तर

6

दुर्भाग्य से, isNaNjava.lang.Double पर एक विधि है, और यह java.lang.Double को एक अंतर्निहित रूपांतरण के लिए आवश्यक है, इसलिए स्काला RichDouble मूल्य वर्ग isNaN reimplement नहीं कर सकते हैं तेजी से हो सकता है, और जब आप का उपयोग isNaN आप java.lang.Double के बॉक्स।

के बाद से इस NaN के लिए परीक्षण करने के लिए केवल धीमी या अजीब तरीके छोड़ देता है, मैं

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

को परिभाषित करने और उसके बाद मैं सिर्फ जांच करने के लिए .nan उपयोग कर सकते हैं।

+0

यह मुक्केबाजी से दोगुना तेज क्यों होना चाहिए? – gzm0

+3

@ gzm0 - क्योंकि यह "बक्से" एक मान वर्ग (जो कि 'AnyVal' भाग को बढ़ाता है) है, जो वास्तव में तब तक नहीं बनाया जाता है जब तक कि आपको इसे ऑब्जेक्ट या जेनेरिक के रूप में पास करने की आवश्यकता नहीं होती है या उसे सरणी में डाल दिया जाता है। यदि आप इसका उपयोग करते हैं (जैसे आप यहां हैं), स्कैला बाइटकोड उत्सर्जित करता है जो कि केवल एक विधि कॉल है, क्योंकि वास्तव में ऐसा कुछ भी नहीं है जिसके लिए वास्तविक वस्तु मौजूद हो। –

+0

क्या आपके 'रिचर्ड डबल' के लिए उच्च प्राथमिकता निहित नहीं हो सकता है, उसी पर 'isNaN' नाम' के साथ? या यदि नहीं, तो अस्पष्टता के साथ विफल होने के लिए एक ही प्राथमिकता में से कुछ को याद दिलाने के लिए खुद को याद दिलाएं कि उस विधि को तंग लूप में उपयोग न करें। –

संबंधित मुद्दे