2011-12-09 14 views
14

निम्न दो कोड अलग परिणाम उत्पन्न:"वापस" और "कोशिश-पकड़ने के अंत में" ब्लॉक मूल्यांकन स्केला में

def x = try{ 
    true 
} finally false 

आह्वान एक्स हो जाता है true

def y:Boolean = try{ 
    return true 
} finally { 
    return false 
} 

y हो जाता है false

आह्वान

return संस्करण जावा के समान व्यवहार करता है।

व्यक्तिगत रूप से मैं कभी भी स्केल में 'वापसी' का उपयोग नहीं करता हूं। लेकिन यह जानना अच्छा है कि स्काला एक कोशिश-अंत-अंत ब्लॉक के मूल्य का मूल्यांकन कैसे करता है। धन्यवाद।

उत्तर

13

आप should not में आखिरकार ब्लॉक में वापसी का विवरण है (भले ही इसे तकनीकी रूप से अनुमति दी गई हो, कम से कम जावा में, सी # उदाहरण के लिए इसे प्रतिबंधित करता है)।

यदि स्कैला अंत में ब्लॉक को एक निहित वापसी थी, तो वह हमेशा इच्छित वापसी मूल्य को रोक देगा। तो इसका कोई मतलब नहीं है।

लेकिन मुझे लगता है कि अगर आप इसे स्पष्ट रूप से लिखते हैं तो यह आपकी मदद नहीं कर सकता है।

+0

लेकिन "एक निहित वापसी" क्या है? – xiefei

+0

"लागू वापसी": शायद गलत शब्द, लेकिन मेरा मतलब यह था कि स्कैला ब्लॉक ब्लॉक में अंतिम पंक्ति के परिणाम को ब्लॉक के लिए वापसी मूल्य के रूप में उपयोग करता है। – Thilo

+2

थिलो सही है। 'अंत में' ब्लॉक में 'वापसी' कथन डालना एक गलती माना जाना चाहिए, और वास्तव में अनुमति नहीं है। 'अंत में' चीजों को साफ करना है इससे कोई फर्क नहीं पड़ता कि विधि शरीर सफल होता है या अपवाद फेंकता है या नहीं। वापसी मूल्य तय करने के लिए यह जगह नहीं है! इसलिए, 'अंतराल 'का मूल्यांकन' यूनिट' के मूल्यांकन के लिए लिया जाता है। आपके पहले उदाहरण में, 'झूठी' को पूरी तरह से 'यूनिट' में परिवर्तित कर दिया गया है। –

9

स्काला भाषा कल्पना के अनुसार:

एक कोशिश अभिव्यक्ति कोशिश {b} अंत में ई का मूल्यांकन करता है ब्लॉक बी। यदि बी का मूल्यांकन अपवाद को अपनाने का कारण नहीं बनता है, तो अभिव्यक्ति ई का मूल्यांकन किया जाता है। यदि अपवाद ई के मूल्यांकन के दौरान फेंक दिया गया है, तो प्रयास अभिव्यक्ति का मूल्यांकन को अपवाद के साथ निरस्त कर दिया गया है। यदि ई के मूल्यांकन के दौरान कोई अपवाद नहीं डाला जाता है, तो बी का परिणाम प्रयास अभिव्यक्ति के परिणाम के रूप में वापस कर दिया जाता है।

यह व्यवहार उस स्पेक के विरोधाभास में प्रतीत होता है। मुझे लगता है कि, 'वापसी' के बाद से फ़ंक्शन से तत्काल वापसी का कारण बनता है, इसके परिणामस्वरूप प्रयास ब्लॉक के लिए मानक व्यवहार को ओवरराइड करना पड़ता है। एक रोशन उदाहरण है:

def z : Boolean = { 
    val foo = try { true } finally { return false } 
    true 
} 

z रिटर्न false लागू।

+3

हां, अंत में ब्लॉक ब्रेक प्रवाह नियंत्रण से लौट रहा है। इसे मना किया जाना चाहिए। – Thilo

+11

'वापसी 'हमेशा प्रवाह नियंत्रण तोड़ता है। यह केवल उस मामले में विशेष रूप से अजीब हो जाता है। – Debilski

+0

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

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