2014-10-31 8 views
5

मैं स्कैला सीख रहा हूं और मैंने रिटर्न स्टेटमेंट का उपयोग करने के बारे में कुछ देखा है।रिटर्न स्टेटमेंट का उपयोग करने और अंतिम मूल्य वापस करने के लिए डिफ़ॉल्ट करने के बीच क्या अंतर है?

तो, स्पष्ट रूप से स्कैला में, यदि आपके पास रिटर्न स्टेटमेंट नहीं है, तो अंतिम मान डिफ़ॉल्ट रूप से वापस किया जाता है। जो माहान है। लेकिन अगर आप वापसी प्रकार निर्दिष्ट किए बिना वापसी कथन का उपयोग करें, स्काला का कहना है "error: method testMethod has return statement; needs result type"

तो यह काम करता है

def testMethod(arg: Int) = { 
    arg*2 
    } 

लेकिन इस त्रुटि

def testMethod(arg: Int) = { 
    return arg*2 
    } 

यह मुझे मेरी ठोड़ी खरोंच और जाना बनाता है देता है

Mmmmmmmm ... उस के लिए एक कारण होना चाहिए।

क्यों स्पष्ट प्रकार घोषणा की आवश्यकता नहीं है जब आप एक वापसी कथन का उपयोग, लेकिन आप स्काला पिछले मूल्य वापस नहीं जाने कब? मैंने माना कि वे बिल्कुल वही बात थे, और वापसी विवरण केवल तभी होते हैं जब आप एक नेस्टेड फ़ंक्शन/सशर्त आदि के अंदर एक मूल्य वापस करना चाहते हैं (दूसरे शब्दों में, कि "वापसी" कथन स्वचालित रूप से आपके अंतिम मूल्य में डाला जाता है कंपाइलर द्वारा .. यदि विधि में कहीं और मौजूद नहीं है)

लेकिन स्पष्ट रूप से मैं गलत था। निश्चित रूप से कार्यान्वयन में कुछ और अंतर होना चाहिए?

क्या मुझे कुछ याद आ रही है?

+0

मैं इसे संकलन नहीं है क्योंकि आप वास्तव में कीवर्ड 'return' का उपयोग कर रहे हैं की कल्पना के साथ चला जाता रख दिया और मैं सही था। मैं अपना जवाब एक सेकंड में पोस्ट करूंगा। असल में, यदि आप रिटर्न का उपयोग करते हैं, तो यह देखने जा रहा है कि आपने रिटर्न टाइप को अपने आप में डालने के बजाए अपना लौटा प्रकार घोषित कर दिया है। – Luminous

उत्तर

4

यदि आपके पास अपनी विधि से एकाधिक निकास बिंदु हैं, तो संकलक के लिए वापसी प्रकार का अनुमान लगाना असंभव हो सकता है। आपकी विधि से एकाधिक निकास बिंदु प्राप्त करने का एकमात्र तरीका, एकाधिक return एस का उपयोग कर है। (या एक return प्लस अंतर्निहित वापसी।)

नियमों के बाद से, जब यह काम करता है और जब ऐसा नहीं होता, बहुत जटिल हैं, यह उपयोगकर्ता है कि यह कभी कभी बेतरतीब ढंग से काम करता है के लिए लग सकता है और कभी-कभी ऐसा नहीं करता। एक स्पष्ट return की उपस्थिति में बस टाइप अनुमान को पूरी तरह से प्रतिबंधित करना एक बहुत ही सरल नियम है, भले ही थोड़ा सा प्रतिबंधक हो।

1

यह प्रश्न "When is a return type required for methods in Scala?" पूरी तरह से एक अलग सवाल था, लेकिन यह ओपी के समान क्षेत्र में है।


इस उत्तर बताते हैं जब (नहीं क्यों) आप इसे एक वापसी प्रकार देना है:

https://stackoverflow.com/a/3127260/2567273

Programming Scala पुस्तक के Chapter 2. Type Less, Do More का उल्लेख है:

जब स्पष्ट प्रकार की टिप्पणियां आवश्यक हैं। निम्नलिखित मामलों में

विधि वापसी मान::

व्यावहारिक दृष्टि से, आप निम्न स्थितियों के लिए स्पष्ट प्रकार एनोटेशन प्रदान करने के लिए

  • जब आप स्पष्ट रूप से एक विधि में वापसी (यहां तक ​​कि फोन पर समाप्त)।
  • जब कोई विधि रिकर्सिव होती है।
  • जब कोई विधि ओवरलोड हो जाती है और विधियों में से एक दूसरे को कॉल करता है। कॉलिंग विधि को रिटर्न टाइप एनोटेशन की आवश्यकता होती है।
  • जब अनुमानित वापसी प्रकार आपके इरादे से अधिक सामान्य होगा, उदाहरण के लिए, Any

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

+0

मुझे यकीन नहीं है कि औचित्य किसी भी समझ में आता है। – acjay

+0

एक कंपाइलर के पीओवी से मुझे लगता है कि यह करता है। कभी-कभी परिस्थिति का अनुमान लगाने के लिए परिस्थिति बहुत जटिल होती है। जब यह नहीं हो सकता है, तो आपको इसे बताना होगा। ओपी के उदाहरण जैसे बुनियादी परिस्थितियों में भी, 'रिटर्न' का उपयोग करके एक अनुबंध शुरू होता है जिससे आप रिटर्न प्रकार भी बताएंगे। मैं केवल इस जवाब को फेंक रहा हूं जो मुझे अपने कंपाइलर्स वर्ग से पता है। मैं एक स्केल प्रोग्रामर नहीं हूँ। – Luminous

+0

एएसटी से एक अनावश्यक अंतिम 'रिटर्न' को छीनने के लिए यह एक छोटा संकलक कदम होगा। तो मुझे लगता है कि यह कहना अधिक सटीक होगा (जैसा कि दूसरा जवाब करता है) कि उन्होंने 'वापसी' के साथ नियमों की स्थिरता का चयन किया - एक 'अनावश्यक अंतिम' वापसी के लिए अनुमान प्रदान करने पर 'वापसी' का एकमात्र आवश्यक उपयोग - । – acjay

1

क्या आपको लगता है कि टाइप अनुमान के लिए के रूप में वापसी प्रकार को चिह्नित करना चाहिए:

def func(n:Int) = { 
    if(n<10) return 23; 
    if(n>10) true else false; 
} 

पहली पंक्ति का सुझाव दिया गया मान प्रकार Int का होना चाहिए। लेकिन निहित वापसी एक बूलियन का सुझाव देता है। तो यह वास्तव में वापसी प्रकार क्या होना चाहिए पर काफी बहस हो जाता है। Int, Boolean या Any?

स्पष्ट वापसी का उपयोग नहीं किया गया था, तो रिटर्न प्रकार के फ़ंक्शन को निर्धारित करना काफी आसान है। लेकिन इसके साथ, यह थोड़ा अस्पष्ट और अज्ञात है। सबसे आसान समाधान उपयोगकर्ता के लिए रिटर्न प्रकार को स्पष्ट रूप से निर्दिष्ट करने के लिए होगा। यह संकलक के लिए जीवन को अधिक आसान बनाता है।

इसके अलावा टीम स्पष्ट वापसी प्रकार के उपयोग को हतोत्साहित करने की कामना की, इसलिए ऐसी लोगों मैनुअल प्रकार इरादा :)

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