F # में फ़ीचर और सदस्यों की दृश्यता टाइप करें #नामक सुविधा है जो मौजूदा प्रकारों को विस्तारित करने की डेवलपर क्षमता प्रदान करती है। दो प्रकार के एक्सटेंशन हैं: आंतरिक विस्तार और वैकल्पिक एक्सटेंशन। पहला एक सी # में आंशिक प्रकार के समान है और दूसरा एक विधि विस्तार (लेकिन अधिक शक्तिशाली) के समान कुछ है।F #
आंतरिक विस्तार का उपयोग करने के लिए हमें एक ही फ़ाइल में दो घोषणाएं करनी चाहिए। इस मामले में कंपाइलर दो परिभाषाओं को एक अंतिम प्रकार में विलय करेगा (यानी यह एक प्रकार का दो "भाग" है)।
मुद्दा यह है कि उन दो प्रकार के विभिन्न सदस्यों और मूल्यों के लिए विभिन्न पहुँच नियम है:
// SampleType.fs
// "Main" declaration
type SampleType(a: int) =
let f1 = 42
let func() = 42
[<DefaultValue>]
val mutable f2: int
member private x.f3 = 42
static member private f4 = 42
member private this.someMethod() =
// "Main" declaration has access to all values (a, f1 and func())
// as well as to all members (f2, f3, f4)
printf "a: %d, f1: %d, f2: %d, f3: %d, f4: %d, func(): %d"
a f1 this.f2 this.f3 SampleType.f4 (func())
// "Partial" declaration
type SampleType with
member private this.anotherMethod() =
// But "partial" declaration has no access to values (a, f1 and func())
// and following two lines won't compile
//printf "a: %d" a
//printf "f1: %d" f1
//printf "func(): %d" (func())
// But has access to private members (f2, f3 and f4)
printf "f2: %d, f3: %d, f4: %d"
this.f2 this.f3 SampleType.f4
मैं एफ # विनिर्देश पढ़ लेकिन किसी भी विचार क्यों एफ # संकलक मूल्य और सदस्य घोषणाओं के बीच अंतर नहीं मिला।
एफ # कल्पना की 8.6.1.3 section में कहा कि "कार्यों और मूल्यों उदाहरण परिभाषाओं द्वारा परिभाषित lexically scoped (और इस तरह परोक्ष निजी) वस्तु परिभाषित किया जा रहा करने के लिए कर रहे हैं।"। आंशिक घोषणा में सभी निजी सदस्यों (स्थिर और उदाहरण) तक पहुंच है। मेरा अनुमान है कि "लेक्सिकल स्कोप" विनिर्देश लेखकों द्वारा विशेष रूप से केवल "मुख्य" घोषणा का मतलब है लेकिन यह व्यवहार मेरे लिए अजीब लगता है।
सवाल यह है: क्या यह व्यवहार जानबूझकर और इसके पीछे क्या तर्क है?
मुझे दो प्रकार के प्रकार के एक्सटेंशन के बीच समानता के बारे में आपकी बात मिली। लेकिन * आंतरिक * और * वैकल्पिक * एक्सटेंशन का व्यवहार अलग-अलग है: वैकल्पिक एक्सटेंशन केवल विस्तारित प्रकार की सार्वजनिक सतह तक पहुंच सकते हैं लेकिन आंतरिक एक्सटेंशन के पास अभी भी विस्तारित प्रकार के निजी और संरक्षित सदस्यों तक पहुंच है। इसलिए उनके पास अलग-अलग अर्थशास्त्र भी थे, न केवल कवर के तहत संकलित किए गए। –
@ सेर्गेटी टेप्लाकोव हम्म, यह एक अच्छा मुद्दा है। आप सही हैं कि वे इस पहलू में भिन्न हैं। मुझे लगता है कि इस बिंदु में मुख्य बिंदु "व्याख्यात्मक दायरा" की परिभाषा है (जो एफ # विनिर्देश में स्पष्ट रूप से गायब है)। –
धन्यवाद, टॉमस। मुझे लगता है कि आप शब्दावली के दायरे के बारे में सही हैं। मेरा मुद्दा यह है कि सी # में आंशिक प्रकार डिजाइनरों के समर्थन के लिए प्रसिद्ध और व्यापक रूप से उपयोग की जाने वाली सुविधा है। लेकिन इस तरह के प्रतिबंध के साथ हम आंतरिक विस्तार को पूर्ण-विशेषीकृत आंशिक प्रकार की घोषणा के रूप में नहीं देख सकते हैं। और इसका मतलब यह है कि जब तक आंतरिक एक्सटेंशन में ऐसे प्रतिबंध नहीं होते हैं, तब तक हम किसी भी डिजाइनर का समर्थन नहीं कर सकते (WinForms और WPF के लिए)। –