2013-05-04 9 views
7

चेन पैटर्न मिलान संरचनाओं के लिए क्यों संभव नहीं है? उदाहरण के लिए, निम्नलिखित, कानूनी, अगर अतर्कसंगत हैपैटर्न मिलान "वापसी" मूल्य

val a = ADT(5) 

val b = a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} 
b match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

लेकिन निम्नलिखित नहीं है:

a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

मुझे लगता है यह है क्योंकि मैं यह पहली जगह में नहीं करना चाहिए, लेकिन सिद्धांत रूप में मुझे नहीं लगता कि यह कानूनी क्यों नहीं है।

+4

'(एक मैच {..}) मैच {} ..' काम करेंगे। – user2246674

उत्तर

5

हाँ, यह काम करना चाहिए, क्योंकि (लगभग) स्काला में सब कुछ एक अभिव्यक्ति है और हर अभिव्यक्ति एक पैटर्न मैच के रूप में इस्तेमाल किया जा सकता।

इस मामले में पैटर्न मैच एक अभिव्यक्ति है, तो यह एक और "श्रृंखलित" पैटर्न मैच के द्वारा प्रयोग किया जा सकता है। लेकिन संकलक इसे पसंद नहीं करता है।

संकलक कोष्ठकों के साथ एक छोटे से संकेत देते हुए मदद करता है:

case class ADT(value: Int) 

val a = ADT(5) 

(a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
}) match { 
    case ADT(a) if a > 13 => println(a) 
    case _ => {} 
} 
+0

मैंने ब्रांड्स के कामकाज पर भी ठोकर खाई, लेकिन मुझे समझ में नहीं आ रहा है कि यह क्यों जरूरी है, लेकिन 'वैल ए = अगर (झूठा) 6 और अगर (सत्य) अगर (सत्य) 5 अन्य 3 अन्य 2' –

+0

@CarlSummers संकलक केवल इतना अनुमान लगा सकते हैं। यह सिर्फ संचालन का आदेश है। जब संदेह में (आप, या संकलक) स्पष्ट हो जाते हैं। (मैं वास्तव में स्कैला के लिए नया हूं लेकिन यह उन चीज़ों में से एक है जिन्हें मैं इसके बारे में पसंद करता हूं।) – hangtwenty

3

आपकी अंतर्ज्ञान सही है; यह बकवास — सामान्य रूप से आप इस तरह से श्रृंखला इन्फ़िक्स ऑपरेटरों करने में सक्षम होगा, कोष्ठकों बिना (के रूप में अन्य उपयोगकर्ताओं का सुझाव दिया है) नहीं है। दरअसल, match की विधि — रूप में लागू किया और के रूप में एक इन्फ़िक्स ऑपरेटर (बाएं साहचर्य डिफ़ॉल्ट रूप से) — तो अपने वैकल्पिक वाक्य रचना काम किया है | काम करने की। हालांकि, स्कैला 2.5, match में एक विधि के बजाय एक विशेष भाषा निर्माण किया गया था। दुर्भाग्यवश, मुझे नहीं पता कि यह क्यों किया गया था, लेकिन यही कारण है: match ऐसा नहीं होने के बावजूद एक इंफिक्स ऑपरेटर है।

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