2011-05-30 10 views
11

मुझे आश्चर्य है कि मानक लाइब्रेरी पूरी तरह से null -Free और - यदि नहीं - रुचि होगी कि उचित उपयोग-मामले मौजूद हैं, जहां null लौटने पर कुछ Option उदाहरण लौटने के लिए बेहतर है।कौन सा स्काला विधियां एक विकल्प के बजाय शून्य लौटती हैं और क्यों?

+0

'शून्य' लौटने के लिए एकमात्र उचित उपयोग केस तब होता है जब आप एक लाइब्रेरी का उपयोग कर रहे होते हैं जो "नतीजे" को "नतीजे" के संकेत के रूप में कॉलबैक से वापस करने की अपेक्षा करता है। स्काला कोड से विरासत जावा पुस्तकालयों से निपटने के दौरान अक्सर यह एक आवश्यक बुराई होती है। –

+0

सामान्य रूप से, स्कैला लाइब्रेरी विधियां या तो विकल्प लौटाएंगी या अगर अपरिहार्य कहा जाता है तो एक अपवाद फेंक देगा (उदाहरण के लिए, सिर और आखिरी सूची में)। मैं किसी भी वापसी के बारे में नहीं जानता। –

उत्तर

5

NamespaceBinding स्थानीय नामस्थान के लिए null या निम्नलिखित मामले में एक अपरिभाषित इनपुट देता है।

$ scala 
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> (<foo/>).scope.getURI("something") 
res0: String = null 

ऐसा क्यों है StringOption[URI] के बजाय उपयोग कर रहा है, मैं नहीं जानता।

+1

'scala.xml.Elem' से संबंधित है जो 'स्ट्रिंग' उपसर्ग मान लेता है जिसे किसी नामस्थान उपसर्ग के लिए' शून्य 'होने की उम्मीद है। फिर, यह क्यों नहीं है 'विकल्प [स्ट्रिंग]' मेरे बाहर है। –

+0

कम से कम यह लगातार परेशान है .. –

-1

मैं किसी के बारे में नहीं सोच सकता, इसलिए मैंने एपीआई (inurl: scala-lang.org/api return + null) में एक Google खोज की है और ऐसा लगता है कि यह किसी भी दस्तावेज के उपयोग को शून्य नहीं देता है।

कोई आंतरिक उपयोग मौजूद हो सकता है। ऐसा करने के लिए मैं सोच सकता हूं कि एकमात्र कारण अतिरिक्त कुछ वस्तु से बचने या जावा के साथ आसान एकीकरण से बचने के लिए होगा। दोनों असंभव प्रतीत होते हैं।

+1

चूंकि स्कैला ज्यादातर समय 'रिटर्न' का उपयोग नहीं करता है, इसलिए यह खोज वास्तव में ज्यादा नहीं पकड़ पाएगी। –

+0

मैं कोड में वापसी के बारे में बात नहीं कर रहा था, लेकिन टिप्पणी में वापस लौटें – thoredge

5

मानक पुस्तकालय में उपयोग की जाने वाली एकमात्र जगह null वैकल्पिक रेगेक्स समूह हैं।

scala> val number = """(\d+)(\.\d+)?""".r // matches digits optionally followed by a . and more digits 
number: scala.util.matching.Regex = (\d+)(\.\d+)? 
scala> "12" match { 
    | case number(intPart, decimalPart) => (intPart, decimalPart) 
    | } 
res0: (String, String) = (12,null) 

मुझे लगता है, तर्क यहाँ है कि आप सभी समूहों के लिए Option[String] उपयोग करने के लिए नहीं करना चाहती। यदि कोई समूह वैकल्पिक नहीं है, तो यह कोड अनावश्यक रूप से बेकार होगा। दुर्भाग्यवश, यदि समूह वैकल्पिक है तो संकलित समय पर यह ज्ञात नहीं है। इसलिए समूहों से मेल खाने के लिए यह सभी समूहों या null के लिए या तो Option[String] है।

+2

मुझे वास्तव में यह तथ्य पसंद है कि रेगेक्स स्वचालित रूप से पैटर्न मैचर बन जाता है, और तथ्य यह है कि 90% मामलों के लिए आप सीधे 'स्ट्रिंग' चाहते हैं; लेकिन चूंकि स्काला लगभग पूरी तरह से अजीब अपवादों से मुक्त है, इसलिए यह एक अच्छा विचार हो सकता है अगर उन्होंने स्थिरता के लिए 'विकल्प [स्ट्रिंग]' का उपयोग किया हो। 'विकल्प [स्ट्रिंग]' और/या 'सूची' अक्सर जेसन को पार्स करते समय आता है और मुझे नहीं लगता कि मैंने उन्हें बहुत ध्यान दिया क्योंकि मैं उन्हें समझ के भीतर उपयोग करता हूं। –

+2

@ यूजीन टिप: यदि आप प्रकार निर्दिष्ट करते हैं, तो यह 'शून्य' के खिलाफ मेल नहीं खाएगा। उदाहरण के लिए, 'केस नंबर (इंटपार्ट: स्ट्रिंग, दशमलवपार्ट: स्ट्रिंग) 'ऊपर की स्ट्रिंग से मेल नहीं खाएगा। –

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