डिफ़ॉल्ट तर्क

कंप्यूटर प्रोग्रामिंग में, एक डिफ़ॉल्ट तर्क एक फ़ंक्शन (प्रोग्रामिंग) के लिए एक पैरामीटर (कंप्यूटर प्रोग्रामिंग) है जिसे प्रोग्रामर को निर्दिष्ट करने की आवश्यकता नहीं है। अधिकांश प्रोग्रामिंग भाषाओं में, फ़ंक्शंस में एक या अधिक तर्क हो सकते हैं। आमतौर पर, प्रत्येक तर्क को पूर्ण रूप से निर्दिष्ट किया जाना चाहिए (यह सी (प्रोग्रामिंग भाषा) में मामला है) ). बाद की भाषाएँ (उदाहरण के लिए, C++ में) प्रोग्रामर को डिफ़ॉल्ट तर्कों को निर्दिष्ट करने की अनुमति देती हैं जिनका हमेशा एक मान होता है, भले ही फ़ंक्शन को कॉल करते समय कोई निर्दिष्ट न हो।

सी ++
में डिफ़ॉल्ट तर्क

निम्नलिखित फ़ंक्शन घोषणा पर विचार करें:

यह फ़ंक्शन तीन तर्क लेता है, जिनमें से अंतिम में बारह का डिफ़ॉल्ट होता है। प्रोग्रामर इस फ़ंक्शन को दो तरीकों से कॉल कर सकता है:

पहले मामले में c नामक तर्क का मान स्पष्ट रूप से निर्दिष्ट किया गया है। दूसरे मामले में, तर्क छोड़ दिया जाता है, और इसके बजाय 12 के डिफ़ॉल्ट मान का उपयोग किया जाएगा। कॉल किए गए फ़ंक्शन के लिए, यह जानने का कोई साधन नहीं है कि कॉल करने वाले द्वारा तर्क निर्दिष्ट किया गया है या यदि डिफ़ॉल्ट मान का उपयोग किया गया था।

उपर्युक्त विधि विशेष रूप से तब उपयोगी होती है जब कोई डिफ़ॉल्ट मानदंड सेट करना चाहता है ताकि फ़ंक्शन को पैरामीटर के साथ या बिना कॉल किया जा सके। निम्न पर विचार करें:

समारोह कॉल: डिफ़ॉल्ट रूप से हैलो वर्ल्ड प्रिंट करेगा! मानक आउटपुट के लिए  (आमतौर पर स्क्रीन)। दूसरी ओर, प्रकार की कोई वस्तु   अब उसी फ़ंक्शन में पास किया जा सकता है और फ़ंक्शन मानक आउटपुट के बजाय दी गई स्ट्रीम पर प्रिंट करेगा। नीचे दिया गया उदाहरण सेट करता है   को , और इस प्रकार आउटपुट को मानक त्रुटि स्ट्रीम प्रिंट करता है।

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

ओवरलोडेड तरीके
कुछ भाषाएँ, जैसे कि जावा (प्रोग्रामिंग भाषा), में डिफ़ॉल्ट तर्क नहीं होते हैं। हालांकि, एक ही नाम के ओवरलोडेड तरीकों को बनाने के लिए विधि अधिभार  का उपयोग करके एक ही व्यवहार को सिम्युलेट किया जा सकता है, जो विभिन्न संख्या में तर्क लेते हैं; और कम तर्क वाले संस्करण केवल अधिक तर्क वाले संस्करणों को कॉल करते हैं, डिफ़ॉल्ट तर्कों को लापता तर्कों के रूप में कहते हैं:

हालाँकि, कई अन्य नुकसान के अलावा, चूंकि डिफ़ॉल्ट तर्कों को टाइप सिस्टम में मॉडल नहीं किया गया है, कॉलबैक का प्रकार (उर्फ उच्च-क्रम फ़ंक्शन) यह व्यक्त नहीं कर सकता कि यह ओवरलोड में से किसी एक को स्वीकार करता है और न ही ओवरलोडेड फ़ंक्शंस के साथ डिफ़ॉल्ट तर्कों का अनुकरण करता है। जबकि, in JavaScript गैर-अतिभारित फ़ंक्शन परिभाषा इनपुट मान होने पर डिफ़ॉल्ट को प्रतिस्थापित कर सकती है  (भले ही यह निहित था   कॉल साइट पर तर्क की अनुपस्थिति या स्पष्ट रूप से पारित होने के माध्यम से   कीमत); जिसे एक वैकल्पिक तर्क पैरामीटर प्रकार के रूप में तैयार किया गया है   in TypeScript। जावास्क्रिप्ट का समाधान स्थिर रूप से हल नहीं किया गया है (अर्थात् संकलन-समय पर नहीं, यही कारण है कि टाइपस्क्रिप्ट केवल वैकल्पिकता को मॉडल करता है और फ़ंक्शन के प्रकार हस्ताक्षर में डिफ़ॉल्ट मान नहीं) इस प्रकार अतिरिक्त रनटाइम ओवरहेड होता है, हालांकि यह उस कॉलबैक में अधिक लचीलापन प्रदान करता है, जो इनपुट के फ़ंक्शन के टाइप हस्ताक्षर (कॉलबैक के प्रकार हस्ताक्षर) द्वारा केंद्रीय रूप से निर्धारित करने के बजाय स्वतंत्र रूप से अपने डिफ़ॉल्ट को नियंत्रित कर सकता है। कॉलबैक। टाइपस्क्रिप्ट समाधान जावा में सिम्युलेटेड हो सकता है   निहित के अनुरूप को छोड़कर टाइप करें   प्रत्येक अनुपस्थित तर्क के लिए एक स्पष्ट है   कॉल साइट पर।

मूल्यांकन
प्रत्येक फ़ंक्शन कॉल के लिए डिफ़ॉल्ट तर्क मानों को कॉल किए गए फ़ंक्शन में पास किया जाना चाहिए। यदि एक डिफ़ॉल्ट तर्क मान में साइड-इफेक्ट्स होते हैं, तो यह महत्वपूर्ण है जब उन साइड इफेक्ट्स का मूल्यांकन किया जाता है - पूरे प्रोग्राम के लिए एक बार (पार्स समय पर, संकलन समय, या लोड समय), या एक बार प्रति फ़ंक्शन कॉल, कॉल समय पर।

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

उदाहरण के लिए:

विस्तार
आम तौर पर एक डिफ़ॉल्ट तर्क फ़ंक्शन के प्रारंभ में घोषित पैरामीटर या एक स्थानीय चर द्वारा पारित तर्क के समान व्यवहार करेगा, और एक पैरामीटर या अन्य स्थानीय चर के रूप में एक ही गुंजाइश (कंप्यूटर विज्ञान) और सीमा (जीवनकाल) है, अर्थात् एक स्वचालित चर जो फ़ंक्शन टर्मिनेशन पर हटा दिया गया है।

अन्य मामलों में इसके बजाय एक डिफ़ॉल्ट तर्क स्थिर रूप से आवंटित किया जा सकता है। यदि वेरिएबल म्यूटेबल है, तो यह एक स्थैतिक चर के साथ फंक्शन कॉल्स में अपना मान बनाए रखेगा।

यह व्यवहार पायथन में परिवर्तनशील प्रकारों के लिए पाया जाता है, जैसे कि सूचियाँ। मूल्यांकन के साथ, एक स्थानीय चर के समान सीमा सुनिश्चित करने के लिए, एक प्रहरी मूल्य का उपयोग कर सकते हैं: