2015-01-27 9 views
5

एफ # में मैं वाक्यविन्यास के भीतर विभिन्न स्थानों में पैटर्न मिलान का उपयोग कर सकता हूं।एक कन्स्ट्रक्टर तर्क को कैसे नष्ट किया जाए?

उदाहरण के लिए:

// Given this type... 
type SingleCaseUnion = | SingleCaseUnion of int 

/// ...I can do this: 
let destructureInFunc (SingleCaseUnion n) = 
    printfn "%d" n 

// ...and this: 
type DestructureInMethod() = 
    member t.M(SingleCaseUnion n) = 
     printfn "%d" n 

लेकिन मैं बाहर काम नहीं कर सकता ऐसा करने के तरीके:

type DestructureInCtor(SingleCaseUnion n) = 
    do printfn "%d" n 

// type DestructureInCtor(SingleCaseUnion n) = 
// ---------------------------------------^ 
// 
// stdin(3,40): error FS0010: Unexpected identifier in type definition. Expected ')' or other token. 

मैं वाक्य रचना गलत है, या एफ # पैटर्न का समर्थन नहीं निर्माता मानकों में मिलान करता है ?

primary-constr-args : attributesopt accessopt (simple-pat, ... , simplepat) 
simple-pat : 
| ident 
| simple-pat : type 

के रूप में बताया गया है, माध्यमिक कंस्ट्रक्टर्स अनुमति दी जाती है पैटर्न मिलान किए गए मानकों, लेकिन प्राथमिक निर्माता के साथ अंतर प्राथमिक के मापदंडों में से प्रत्येक है दोनों एक है:

+0

हालांकि यह * प्राथमिक * रचनाकारों के लिए काम नहीं करता है, अन्य (माध्यमिक) निर्माता इसे अनुमति देते हैं। * (टिप्पणी के रूप में दोबारा पोस्ट किया गया क्योंकि मेरा जवाब अनावश्यक हो गया।) * – Vandroiy

उत्तर

5

नहीं है, language spec स्पष्ट रूप से नहीं कहते हैं फ़ंक्शन पैरामीटर और एक निजी क्षेत्र की घोषणा।

यदि एफ # यहां मिलान पैटर्न की अनुमति देने के लिए थे, तो कुछ पैटर्न होंगे जो इस एक-पैरामीटर-एक-फील्ड संबंध को तोड़ देंगे।

type DestructureInCtor(SingleCaseUnion _) = 
    // doesn't declare a private field 

या:

type DestructureInCtor((a:int, b:int)) = 
    // declares two private fields? 

यह है कि इस काम कर सकता था, लेकिन मैं लाभ outweighs क्षेत्र घोषणाओं प्रदान करने के लिए बढ़ाया जा करने के लिए मिलान पैटर्न की इजाजत दी की जटिलता अनुमान लगा रहा हूँ समझ से बाहर नहीं है।

+0

spec के सेक्शन 8.6.1.3 को देखकर, एक-से-एक पैरामीटर-फ़ील्ड रिलेशनशिप प्रतीत नहीं होता है। पैरामीटर अपने उपयोग के आधार पर कन्स्ट्रक्टर के लिए स्थानीय रह सकते हैं, जैसे प्राथमिक निर्माता में 'चलो' बाइंडिंग की तरह। * (उदाहरण देखें कि "इनपुट वाई का उपयोग केवल निर्माण के दौरान किया जाता है" * यह देखते हुए कि शेष प्राथमिक निर्माता पैटर्न की अनुमति देता है, मुझे समझ में नहीं आता कि वे पैरामीटर सूची में बहुत अधिक जटिलता क्यों लाएंगे। – Vandroiy

+0

@ वांडरोय आप सही हैं कि यदि किसी पैरामीटर को फ़ील्ड के रूप में उपयोग नहीं किया जाता है, तो कोई फ़ील्ड नहीं बनाया जाता है। लेकिन ये पैरामीटर * नियमित फ़ंक्शन पैरामीटर के लिए अलग हैं। यही कारण है कि यह यहां मिलान पैटर्न की अनुमति देने के लिए जटिलता जोड़ देगा और मैं सुझाव दे रहा हूं कि यह भाषा डिजाइनरों की प्राथमिकताओं पर नहीं था। –

+0

मैं फ़ंक्शन पैरामीटर की बजाय लेट-बाइंडिंग की तुलना कर रहा हूं। 'MyType (pattern) =' को 'MyType (a) = (newline) के रूप में क्यों संकलित नहीं किया जाएगा पैटर्न = a'? पहली नज़र में ज्यादा जटिलता नहीं लगती है। – Vandroiy

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

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