2010-10-05 20 views
5

मेरे पास एक कक्षा है जिसके लिए मैं श्रेणियां लागू कर रहा हूं। मैं फ़ोबोस लाइब्रेरी के तरीके को कार्यान्वित करना चाहता हूं, यानी मुख्य वर्ग के बाहर।गैर सदस्य श्रेणी फ़ंक्शन

void popFront(T)(ref PersistentList!(T) a) 
{ 
    a = a.next(); 
} 

जब मैं एक forech के साथ इस कोड को संकलित करने का प्रयास करें, मैं:

void popBack(T)(ref T[] a) if (!is(Unqual!T == char) && !is(Unqual!T == wchar)) 
{ 
    assert(a.length); 
    a = a[0 .. $ - 1]; 
} 

यहाँ मेरी संस्करण है

Error 1 Error: no property 'popFront' for type 'stmd.PersistentList!(int).PersistentList' main.d 

मैं मुख्य वर्ग में सदस्य कोड चला जाता, लेकिन चूंकि मैं इनपुट "रेफरी" मान को संशोधित कर रहा हूं, इसलिए मैं पॉपफ्रंट() का उपयोग नहीं कर सकता हूं, मुझे वास्तव में पॉपफ्रंट (रेफरी ए) की आवश्यकता है।

मैं क्या गलत कर रहा हूं?

उत्तर

4

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

एंड्री अलेक्जेंड्रेस्कू की पुस्तक, "The D Programming Language" में वर्दी फ़ंक्शन कॉल सिंटैक्स का वर्णन किया गया है, जिसे डी 2 के लिए आधिकारिक मार्गदर्शिका माना जाता है। वर्तमान में कार्यान्वयन की कमी को एक बग माना जाता है। यह कुछ रिलीज में तय किया जाना चाहिए।

+0

टिप्पणी के लिए धन्यवाद। मेरी कक्षाएं अपरिवर्तनीय हैं, इसलिए मेरे पास वास्तव में कक्षा में पॉपफ्रंट सदस्य नहीं हो सकता है। लेकिन मैंने एक "PersistentListRange" उपclass बनाया था, इसलिए मैं foreach (i; lst.range) कर सकता हूं और यह ठीक काम करता है। –

3

फोबोस केवल सरणी के लिए संरचना/कक्षा के बाहर रेंज कार्यों को लागू करता है। Arrays आपको उन पर फ़ंक्शंस कॉल करने की अनुमति देता है जैसे कि वे सदस्य कार्य थे। तो, अगर आप इस समारोह है:

int func(int[] arr) 
{ 
    return arr[0]; 
} 

आप यह इतना

auto arr = [1, 2, 3]; 
auto val = arr.func(); 
बजाय

auto val = func(arr); 

कि सभी प्रकार के साथ सार्वभौमिक समारोह कॉल कहा जाता है ऐसा करने में सक्षम होने के नाते

की तरह कॉल कर सकते हैं वाक्यविन्यास, लेकिन यह वर्तमान में डी में कानूनी नहीं है, हालांकि ऐसा लगता है कि यह शायद जोड़ा जा रहा है।

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

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