2013-08-09 4 views
5

चेनिंग मैच एक्सप्रेशन संकलित नहीं करता है।चेनिंग मिलान अभिव्यक्ति क्यों संकलित नहीं करती है?

val x = Array("abc", "pqr") 

x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
} match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

निम्नलिखित ठीक संकलित जबकि:

(x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
}) match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

क्यों बाद के संस्करण (जहां पहले मैच अभिव्यक्ति paranthesis में है) ठीक संकलन जबकि पहले एक नहीं करता है?

+3

'छोड़कर match' एक तरीका नहीं है यहाँ कहने के लिए कुछ भी नहीं है, लेकिन कीवर्ड और कंपाइलर इस तरह से काम करता है। – senia

+0

@senia हमेशा कुछ कहना है। बिल्कुल मूल या दिलचस्प नहीं है। –

+0

@senia अगर यह पहले से ही उत्तर दिया गया था, तो मेरे पास जवाब नहीं होगा। –

उत्तर

1

यदि यह अनुमति दी गई है, तो आप नहीं कर सका:

scala> List(1,2,3) last match { case 3 => true } 
warning: there were 1 feature warning(s); re-run with -feature for details 
res6: Boolean = true 

यही है, अगर यह इन्फ़िक्स संकेतन थे, तो बाईं ओर बात नहीं पोस्टफ़िक्स हो सकता है।

इंफिक्स मैच को अस्वीकार करने से पोस्टफिक्स जांच की अनुमति मिलती है।

अभिव्यक्ति प्राकृतिक तरीके से

(List(1,2,3) last) match { case 3 => true } 

कि है, अगर पोस्टफ़िक्स अंकन प्राकृतिक और अपवित्र नहीं है पार्स किया गया है यही कारण है कि।

सुविधा चेतावनी import language.postfixOps के लिए है। शायद उस सुविधा के साथ बंद हो गया है, अच्छे के डिफेंडर import language.infixMatch मनोरंजन करने के इच्छुक होंगे।

निर्माणों कि match को वाक्यात्मक भाई बहन हैं, कि कोष्ठक के बिना infixable नहीं हैं पर विचार करें:

scala> if (true) 1 else 2 match { case 1 => false } 
res4: AnyVal = 1 // not false 

scala> (if (true) 1 else 2) match { case 1 => false } 
res1: Boolean = false 

या

scala> throw new IllegalStateException match { case e => "ok" } 
<console>:11: error: type mismatch; // not "ok", or rather, Nothing 
found : String("ok") 
required: Throwable 
       throw new IllegalStateException match { case e => "ok" } 
                   ^

scala> (throw new IllegalStateException) match { case e => "ok" } 
java.lang.IllegalStateException 
संबंधित मुद्दे