F #

2013-04-05 11 views
17

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 (और इस तरह परोक्ष निजी) वस्तु परिभाषित किया जा रहा करने के लिए कर रहे हैं।"। आंशिक घोषणा में सभी निजी सदस्यों (स्थिर और उदाहरण) तक पहुंच है। मेरा अनुमान है कि "लेक्सिकल स्कोप" विनिर्देश लेखकों द्वारा विशेष रूप से केवल "मुख्य" घोषणा का मतलब है लेकिन यह व्यवहार मेरे लिए अजीब लगता है।

सवाल यह है: क्या यह व्यवहार जानबूझकर और इसके पीछे क्या तर्क है?

उत्तर

10

यह एक अच्छा सवाल है! जैसा कि आपने बताया, विनिर्देश कहता है कि "स्थानीय मान परिभाषित किए गए ऑब्जेक्ट पर को स्पष्ट रूप से स्कॉप्ड किया गया है", लेकिन एफ # विनिर्देश को देखते हुए, यह वास्तव में परिभाषित नहीं करता है कि इस मामले में कौन सा शब्दावली स्कोपिंग का अर्थ है।

आपके नमूना शो के रूप में, वर्तमान व्यवहार यह है कि ऑब्जेक्ट परिभाषा का लेक्सिकल गुंजाइश केवल प्राथमिक प्रकार की परिभाषा है (आंतरिक एक्सटेंशन को छोड़कर)। मैं उससे बहुत आश्चर्यचकित नहीं हूं, लेकिन मुझे लगता है कि दूसरी व्याख्या भी समझ में आएगी ...

मुझे लगता है कि इसके लिए एक अच्छा कारण यह है कि दो प्रकार के एक्सटेंशन को वही व्यवहार करना चाहिए (जितना संभव हो सके) और आपको अपनी जरूरत के अनुसार दूसरे का उपयोग करने के लिए अपने कोड को दोबारा उपयोग करने में सक्षम होना चाहिए। दोनों प्रकार केवल अलग-अलग होते हैं कि उन्हें कवर के तहत कैसे संकलित किया जाता है। इस संपत्ति को तोड़ दिया जाएगा यदि किसी प्रकार ने व्याख्यात्मक दायरे तक पहुंच की अनुमति दी जबकि अन्य ने नहीं किया (क्योंकि, विस्तार सदस्य तकनीकी रूप से ऐसा नहीं कर सकता है)।

उसने कहा, मुझे लगता है कि यह विनिर्देश में स्पष्ट किया जा सकता है (कम से कम)। इसकी रिपोर्ट करने का सबसे अच्छा तरीका fsbugs पर microsoft डॉट com पर ईमेल भेजना है।

+2

मुझे दो प्रकार के प्रकार के एक्सटेंशन के बीच समानता के बारे में आपकी बात मिली। लेकिन * आंतरिक * और * वैकल्पिक * एक्सटेंशन का व्यवहार अलग-अलग है: वैकल्पिक एक्सटेंशन केवल विस्तारित प्रकार की सार्वजनिक सतह तक पहुंच सकते हैं लेकिन आंतरिक एक्सटेंशन के पास अभी भी विस्तारित प्रकार के निजी और संरक्षित सदस्यों तक पहुंच है। इसलिए उनके पास अलग-अलग अर्थशास्त्र भी थे, न केवल कवर के तहत संकलित किए गए। –

+0

@ सेर्गेटी टेप्लाकोव हम्म, यह एक अच्छा मुद्दा है। आप सही हैं कि वे इस पहलू में भिन्न हैं। मुझे लगता है कि इस बिंदु में मुख्य बिंदु "व्याख्यात्मक दायरा" की परिभाषा है (जो एफ # विनिर्देश में स्पष्ट रूप से गायब है)। –

+0

धन्यवाद, टॉमस। मुझे लगता है कि आप शब्दावली के दायरे के बारे में सही हैं। मेरा मुद्दा यह है कि सी # में आंशिक प्रकार डिजाइनरों के समर्थन के लिए प्रसिद्ध और व्यापक रूप से उपयोग की जाने वाली सुविधा है। लेकिन इस तरह के प्रतिबंध के साथ हम आंतरिक विस्तार को पूर्ण-विशेषीकृत आंशिक प्रकार की घोषणा के रूप में नहीं देख सकते हैं। और इसका मतलब यह है कि जब तक आंतरिक एक्सटेंशन में ऐसे प्रतिबंध नहीं होते हैं, तब तक हम किसी भी डिजाइनर का समर्थन नहीं कर सकते (WinForms और WPF के लिए)। –

3

मैं microsoft डॉट com पर fsbugs से यह सवाल भेजा है और डॉन सायमे से जवाब निम्नलिखित है:

हाय सेर्गेई,

हाँ, व्यवहार जानबूझकर है। जब आप वर्ग के दायरे में "चलो" का उपयोग करते हैं तो पहचानकर्ता के प्रकार की परिभाषा पर व्याख्यात्मक दायरा होता है। मान को किसी फ़ील्ड में भी नहीं रखा जा सकता है - उदाहरण के लिए यदि किसी भी तरीके से कोई मूल्य कैप्चर नहीं किया जाता है तो यह कन्स्ट्रक्टर के लिए स्थानीय हो जाता है। यह विश्लेषण कक्षा में स्थानीय रूप से किया जाता है।

मैं समझता हूं कि आप इस सुविधा को सी # में आंशिक कक्षाओं की तरह काम करने की उम्मीद करते हैं। हालांकि यह इस तरह से काम नहीं करता है।

मुझे लगता है कि शब्द "शाब्दिक गुंजाइश" चाहिए, कल्पना में और अधिक स्पष्ट रूप से परिभाषित क्योंकि अन्यथा वर्तमान व्यवहार के साथ-साथ अन्य डेवलपर्स के लिए आश्चर्य की बात हो जाएगा हो सकता है।

डॉन को उनकी प्रतिक्रिया के लिए बहुत धन्यवाद!

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