FO

2012-10-19 17 views
22

ऑटोऑपेन विशेषता का उपयोग करने के लिए अनुशंसित सिद्धांत क्या है?FO

(यह सवाल शायद when to use module function VS static function on similarly named type को निरंतरता में है)

विशेषज्ञ एफ # कहा गया है कि "यह उपयोगी हो सकता है जब आप तदर्थ शीर्ष स्तर के ऑपरेटरों और कार्यों को परिभाषित कर रहे हैं:"

तो यह कोड संगठन में मॉड्यूल भूमिका को कम करने के लिए यहां प्रतीत होता है, जब आपको तकनीकी रूप से कोड लिखने की आवश्यकता होती है लेकिन आप अपने अस्तित्व को ग्राहक परिप्रेक्ष्य से हटा देते हैं।

क्या कुछ और है? आप इसका उपयोग कब करते हैं?

उत्तर

30

मुझे लगता है कि AutoOpen विशेषता के लिए मुख्य उपयोग तब होता है जब आप कुछ लाइब्रेंड मान उपलब्ध करना चाहते हैं जब आपकी लाइब्रेरी का उपयोगकर्ता नामस्थान खोलता है। यह वह जगह है जहां विशेषता बहुत उपयोगी है, क्योंकि मुझे लगता है कि पुस्तकालयों को आम तौर पर नामस्थान में सभी परिभाषाओं को निर्यात करना चाहिए, लेकिन कुछ उद्देश्यों के लिए आपको मान निर्यात करने की आवश्यकता है और नामों को नामस्थान के अंदर परिभाषित नहीं किया जा सकता है।

यहाँ F# async extensions से एक उदाहरण है जो एक गणना बिल्डर को परिभाषित करता है और इस प्रकार यह asyncSeq मूल्य (लेकिन एक ही समय में, सभी कार्यक्षमता एक नाम स्थान में लपेटा जाता है) का निर्यात करने की जरूरत है:

namespace FSharp.Async 

type AsyncSeq<'T> = (* ... *) 
type AsyncSeqBuilder() = (* ... *) 

[<AutoOpen>] 
module GlobalValues = 
    let asyncSeq = AsyncSeqBuilder() 

के उपयोगकर्ता लाइब्रेरी सिर्फ open FSharp.Async लिख सकती है और वे asyncSeq देखेंगे। मैं एक ही पैटर्न विभिन्न गणित पुस्तकालयों के साथ प्रयोग किया जाता है लगता है (जहां भी सरल नाम कार्यों निर्यात करना चाहते हैं।)

मॉड्यूल के लिए (जैसे List और Seq), मुझे लगता है कि लोगों की सबसे open का उपयोग नहीं करते और का उपयोग मॉड्यूल नाम (जैसे List.map) के माध्यम से कार्य करता है, इसलिए यदि आप इसे नेस्टेड मॉड्यूल के लिए उपयोग कर सकते हैं, तो मैंने इसे अक्सर नहीं देखा है।

+0

VALUES का उपयोग यह स्पष्ट करता है कि इसका उपयोग कैसे किया जाए। thks – nicolas

16

यह उप मॉड्यूल में एक मॉड्यूल एक एकीकृत/एकल मॉड्यूल दृश्य बाहर से व्यवस्थित लेकिन पेश करने के लिए इस्तेमाल किया जा सकता:

module Outer = 

    [<AutoOpen>] 
    module Inner1 = 
    let f1() =() 

    [<AutoOpen>] 
    module Inner2 = 
    let f2() =() 

open Outer 

let x = f1() 
let y = f2() 

FParsec करता है: open FParsec सभी उप मॉड्यूल को खोलता है (Primitives, CharParsers, आदि ।)।

+1

यह दिलचस्प है – nicolas