2009-10-06 16 views
7

में हस्ताक्षर फ़ाइलें और एक्सेस संशोधक मैं हाल ही में एफ # के ऑब्जेक्ट ओरिएंटेड पहलुओं को सीखने की कोशिश कर रहा हूं, और भाषा में प्रकार/मॉड्यूल तक पहुंच प्रतिबंधित करने के बारे में उत्सुक हो गया हूं।एफ #

Example.fsi

module Stack = 
    val foo : string 

Example.fs

module Stack = 
    let foo = "foo" 
    let bar = "bar" 

और वैकल्पिक रूप से इस:

अधिक विशेष रूप से, मैं इस लेखन के बीच का अंतर जानना चाहता हूँ

module Stack = 
    let foo = "foo" 
    let private bar = "bar" 

क्या वे अंत में एक ही चीज़ को पूरा नहीं करते हैं? सी # पृष्ठभूमि से आ रहा है, मैं हस्ताक्षर (एफएसआई) फ़ाइलों पर एक्सेस संशोधक का उपयोग करने के लिए बहुत इच्छुक हूं। वे अधिक बहुमुखी (उदाहरण के लिए नामस्थानों में मॉड्यूल/प्रकारों पर लागू हो सकते हैं), जबकि मुझे कोई ऐसी स्थिति नहीं है जिसमें हस्ताक्षर फाइलें कुछ संशोधित करती हैं जो मॉडिफायर तक नहीं पहुंचती हैं।

+0

आपका उदाहरण वैसे भी काम नहीं करना चाहिए ;-) (foo _ = "bar" दें) – Dario

+0

यह क्यों काम नहीं करना चाहिए? उदाहरण मेरे लिए ठीक संकलित करता है। – Noldorin

+0

.fsi फ़ंक्शन को फ़ंक्शन के रूप में घोषित करता है, लेकिन फिर .fs इसे मान के रूप में परिभाषित करता है। – Brian

उत्तर

9

वे लगभग एक ही चीज़ को पूरा करते हैं। (ध्यान दें कि आप भी नामस्थान में प्रकार के लिए एक .fsi फ़ाइल का उपयोग कर सकते हैं, इस बारे में अनिश्चित क्या उस के बारे में अपनी टिप्पणी का मतलब था।)

एक हस्ताक्षर फ़ाइल एक जोड़े को लाभ हैं:

  • आप संस्थाओं के लिए public कर सकते हैं फ़ाइल की अवधि, लेकिन फिर परियोजना के बाद की फाइलों के लिए private
  • आप हस्ताक्षर फ़ाइल में केवल अपना संक्षिप्त सारांश प्राप्त कर सकते हैं, इसलिए सार्वजनिक इंटरफ़ेस को कोड कोड स्कैन किए बिना पढ़ना आसान है।

पहली बुलेट को ट्राइल्ड नहीं किया जाना चाहिए - असेंबली इनकैप्यूलेशन वास्तव में बहुत बड़ी परियोजनाओं के लिए एक बहुत बड़ी विशेषता है। File1.fs के भीतर एक दूसरे के लिए सार्वजनिक रूप से कुछ प्रकार को परिभाषित करने में सक्षम होने के बाद, लेकिन फिर केवल उन प्रकारों/तरीकों का सबसेट बाकी के लिए सार्वजनिक हो (फ़ाइल 2.fs, File3.fs, आदि) काफी उपयोगी है (सी ++ में 'दोस्त' की तरह थोड़ा सा)।

+1

@ ब्रायन: उत्तर के लिए धन्यवाद। मैं इस पृष्ठ के निचले हिस्से का जिक्र कर रहा था - http://en.wikibooks.org/wiki/F_Sharp_Programming/Modules_and_Namespaces - नामस्थानों पर एफएसआई का उपयोग करने में सक्षम नहीं है। क्या आप इस परियोजना के "अनुक्रम" से क्या मतलब समझ सकते हैं? – Noldorin

+1

मुझे लगता है कि वह दस्तावेज़ गलत है; @ जुलिएट, अगर आप इसे पढ़ रहे हैं, तो क्या आप इसे अपडेट करेंगे? ध्यान दें कि आप नामस्थानों के लिए .fsi कोड के सिंटैक्स को देखने के लिए नामस्थान वाले एक .fs फ़ाइल पर fsc --sig का उपयोग कर सकते हैं। – Brian

+1

@ ब्रायन: आह, तब पर्याप्त मेला। उपयोगी छोटी कमांड, वह है। स्पष्टीकरण के लिए भी धन्यवाद। – Noldorin