2011-06-26 12 views
25

आप लिख सकते हैं:कैसे करता है | (पाइप) पैटर्न मिलान काम में?

str match { case "foo" | "bar" => ... } 

पहली नज़र में यह | तरह लग रहा है, एक निकालने वस्तु हो सकता है, लेकिन:

str match { case |("foo", "bar") => ... } 

काम नहीं करता। (और मैं नहीं देख सकता कि इसे कैसे लागू किया जा सकता है।)

तो यह एक जादू निर्मित ऑपरेटर है?

(मेरा मानना ​​है कि मैं तो इससे पहले कि पर इस सवाल का देखा है, लेकिन इसके लिए ... खोज करने के लिए असंभव है), यह स्काला संकलक द्वारा व्याख्या की है

+1

यहां एक [उदाहरण] है (http://stackoverflow.com/questions/6384073/catching-multiple-exceptions-at-once-in-scala/6385333#6385333)। – agilesteel

उत्तर

24

हां पाइप (|) पैटर्न मिलान के लिए अंतर्निहित है (the scala language reference देखें)। पैटर्न मिलान अनुभाग (धारा 8) धारा 8.1.11 में परिभाषित करता है जिसे पैटर्न विकल्प कहा जाता है। परिभाषा कहती है:

एक पैटर्न वैकल्पिक पी 1 | ... | पीएन में कई वैकल्पिक पैटर्न पाई शामिल हैं। सभी वैकल्पिक पैटर्न पैटर्न पैटर्न के प्रकार के साथ चेक किए गए हैं। वे वाइल्डकार्ड के अलावा अन्य बाध्य नहीं हो सकते हैं। विकल्प पैटर्न एक मूल्य के वी से मेल खाता है कम से कम एक इसके विकल्प वी मेल खाता है।

तो हाँ, पाइप है अगर एक अंतर्निहित इस संदर्भ प्रतिमान मिलान के प्रति संवेदनशील है।

35

| पुस्तकालय में लागू नहीं है। यह एक नया पैटर्न है कि दो subpatterns है कि किसी भी चर के लिए बाध्य नहीं है (हालांकि नवगठित पैटर्न ही बाध्य किया जा सकता है के बीच अलगाव के रूप में परिभाषित किया गया है बनाता है, यानी, आप

try { /*...*/ } 
catch { 
    case e @ (_: IOException | _: IllegalArgumentException) => /*...*/ 
} 

और e के रूप में हो जाता है की तरह सामान लिख सकते हैं सूचीबद्ध विकल्पों का सबसे विशिष्ट सुपरटेप टाइप करें)।

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