2012-03-27 4 views
6

में ऑर्ड फ़ंक्शन कार्यान्वयन, कुछ भाषा मूलभूत बातें बेहतर ढंग से समझने के उद्देश्य से घर पर एक अभ्यास के रूप में, मैंने Ord फ़ंक्शन को पुन: कार्यान्वित करने का प्रयास किया, लेकिन मुझे एक समस्या आई।डेल्फी

वास्तव में, मौजूदा Ord समारोह विभिन्न प्रकार की एक किस्म के तर्क को स्वीकार कर सकते (AnsiChar, Char, WideChar, Enumeration, Integer, Int64) और पूर्णांक या Int64 लौट सकते हैं।

मैं यह नहीं समझ सकता कि एक ही फ़ंक्शन के कई संस्करणों को कैसे घोषित किया जाए।

इसे डेल्फी में कैसे कोड किया जाना चाहिए?

उत्तर

9

Ord डेल्फी में कोडित नहीं किया जा सकता। यद्यपि आप एक ही नाम के साथ कई फ़ंक्शंस लिखने के लिए the overload directive का उपयोग कर सकते हैं, आप Ord फ़ंक्शन को इस तरह से नहीं लिख सकते हैं क्योंकि यह कई परिभाषाओं की आवश्यकता के बिना मनमाना प्रकार के तर्क प्रकारों के लिए काम करता है। (कोई फर्क नहीं पड़ता कि आप कितने Ord भार के बारे में, मैं हमेशा ऊपर संकलक की इच्छा एक प्रकार है कि अपने कार्यों को स्वीकार नहीं करेगा साथ लेकिन वह आ सकता है।)

ऐसा नहीं है कि जिस तरह से की वजह से संकलक जादू काम करता है। कंपाइलर Ord और प्रोग्राम में सभी सामान्य प्रकार के बारे में जानता है, इसलिए यह फ़ंक्शन के कार्यों को ऑनलाइन करता है। अन्य कंपाइलर-जादू कार्यों में Length (जादू क्योंकि यह मनमाने ढंग से सरणी प्रकारों को स्वीकार करता है), Str (जादू क्योंकि यह चौड़ाई और परिशुद्धता संशोधक स्वीकार करता है), और ReadLn (जादू क्योंकि यह मानकों की मनमानी संख्या स्वीकार करता है)।

+0

यह शीर्षक में संदर्भित प्रश्न का सही उत्तर है। – boileau

+0

मुझे पूरी तरह से आश्वस्त नहीं है कि अनियमित पैरामीटर + कुछ आरटीटीआई गड़बड़ का उपयोग कर वर्तमान डेल्फी में 'ord' * असंभव * होगा। लेकिन दिया, कम से कम यह बेहद अव्यवहारिक होगा! –

+0

@ जुनास, untyped मतलब है * नहीं * प्रकार है। आप किसी प्रकार से टाइप की जानकारी नहीं प्राप्त कर सकते हैं जिसमें कोई प्रकार नहीं है। यदि आप * जेनेरिक * का उपयोग करने का सुझाव देते हैं, तो कुछ आशा हो सकती है। –

12

मैं यह नहीं समझ सकता कि एक ही फ़ंक्शन के कई संस्करणों को कैसे घोषित किया जाए।

इसे function overloading कहा जाता है। इनपुट पैरामीटर प्रत्येक संस्करण के लिए अलग होना चाहिए, वापसी प्रकार कोई फर्क नहीं पड़ता। उदाहरण के लिए:

function Ord(X: Char): Integer; overload; 
begin 
    // Whatever here 
end; 

function Ord(X: Integer): Integer; overload; 
begin 
    // Something 
end; 

// etc. 
+4

हालांकि ध्यान दें कि 'सामान्य' सामान्य पास्कल फ़ंक्शन की बजाय एक विशेष जादू कार्य है। उस बिंदु को घर चलाने के लिए, याद रखें कि 'ऑर्ड' भाषा में ओवरलोड किए जाने से पहले लंबे समय से अस्तित्व में था। –

+0

सच है, और यदि सीखने के उद्देश्यों के लिए पुनर्मूल्यांकन, इसे 'ord' से कुछ और कहने के लिए बेहतर है! –

+2

डेविड्स के लिए एक साइड नोट के रूप में टिप्पणी: ऑर्ड का कार्यान्वयन वास्तव में कुछ भी नहीं है क्योंकि यह कोई अतिरिक्त ऑपोड नहीं बनाता है। इसे एन। विर्थ से मूल पास्कल विवरण में वापस घोषित किया गया था और केवल कंपाइलर को टाइप मिस्चैच को अनदेखा करने के लिए कहता है। तो वास्तव में: बुरा उदाहरण ... –