2012-09-08 17 views
21

कभी कभी मैं सशर्त, और matchings के कई नेस्टेड स्तरों, कि बहुत स्पष्ट होना समारोह से बाहर निकलने के लिए एक स्पष्ट वापसी का उपयोग कर होगा साथ स्काला कोड का हिस्सा देखते हैं, से बचने के लिए किसी कारण है।वहाँ वापसी बयान

वहाँ जो स्पष्ट वापसी बयानों से बचने में कोई लाभ है?

+0

यहाँ पर संबंधित ब्लॉग पोस्ट है [वापसी] (https://tpolecat.github.io/2014/05/09/return.html) – BlueSky

उत्तर

17

एक return, एक अपवाद फेंक द्वारा कार्यान्वित तो यह एक विधि का परिणाम घोषित करने के लिए मानक तरीका अधिक एक निश्चित भूमि के ऊपर हो सकता है हो सकता है। (मामले उनका कहना है यह हमेशा नहीं है, शायद नहीं भी अक्सर, के लिए किम Stebel के लिए धन्यवाद।)

इसके अलावा, एक return को बंद करने पर विधि जिसमें बंद परिभाषित किया गया है से बस नहीं वापस आ जाएगी, और बंद होने से ही। इससे यह दोनों उपयोगी हो जाता है, और बंद होने से परिणाम लौटने के लिए बेकार है।

ऊपर का एक उदाहरण:

def find[T](seq: Seq[T], predicate: T => Boolean): Option[T] = { 
    seq foreach { elem => 
    if (predicate(elem)) return Some(elem) // returns from find 
    } 
    None 
} 

आप अभी भी समझ में नहीं आता है, तो elem => if (predicate(elem)) return Some(elem) है कि एक गुमनाम वस्तु की विधि apply है Function1 लागू करता है और पैरामीटर के रूप में foreach को पारित कर दिया है। इससे return निकालें, और यह काम नहीं करेगा।

+0

वापसी हमेशा अपवाद का उपयोग कर लागू नहीं है। बस इसमें एक रिटर्न स्टेटमेंट के साथ लूप को सरल बनाएं और javap -v के साथ आउटपुट देखें। असल में, मैं कोई उदाहरण देखना चाहूंगा जहां वापस _is_ को लागू किया गया था। –

+0

@ किमस्टेलबेल दिलचस्प, मुझे नहीं पता था कि स्कैला ने उस मामले को अनुकूलित किया था। उदाहरण के लिए, बस मेरे उत्तर में कोड देखें। –

+0

मुझे यकीन है कि जब आप कहते हैं कि क्लोजर पर वापसी उस विधि से वापस आ जाएगी, जिसे क्लोजर इटसेफ से नहीं किया जाता है, तो आप क्या समझते हैं। मैं पहले से ही, उस के साथ जल गया गया है के रूप में आप यहाँ http://stackoverflow.com/questions/11929485/scala-problems-with-return-statement उदाहरण उपलब्ध कराने में विस्तार से बताया – opensas

2

एक दोष यह है कि वापसी प्रकार का पता नहीं लगाया जा सकता है। बाकी सब कुछ शैली का मामला है। जो आपको अस्पष्ट या भ्रमित लगता है वह किसी और के लिए पूरी तरह से "प्राकृतिक" हो सकता है।

2

एक स्पष्ट वापसी नियंत्रण प्रवाह टूट जाता है। उदाहरण के लिए आप की तरह

if(isAuth(user)) { 
return getProfile(user) 
} 
else { 
return None 
} 

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

// start 
def someString:String = return "somestring" 

// def without return 
def someString = "somestring" 

// after refactoring 
val someString = "somestring"  

तुम देखो प्रकार एनोटेशन जोड़ा जाना आवश्यक है कि और जब एक वैल को डीफ़ बदलते हैं तो उसे रिटर्न को हटाने की आवश्यकता होती है।