डिफ़ॉल्ट तर्क
This article needs additional citations for verification. (May 2009) (Learn how and when to remove this template message) |
कंप्यूटर प्रोग्रामिंग में, डिफ़ॉल्ट आर्गुमेंट फ़ंक्शन (प्रोग्रामिंग) के लिए एक पैरामीटर (कंप्यूटर प्रोग्रामिंग) है जिसे प्रोग्रामर को निर्दिष्ट करने की आवश्यकता नहीं है। अधिकांश प्रोग्रामिंग भाषाओं में, फ़ंक्शंस में एक या अधिक आर्गुमेंट हो सकते हैं। साधारण तौर पर, प्रत्येक आर्गुमेंट को पूर्ण रूप से निर्दिष्ट किया जाना चाहिए (यह C (प्रोग्रामिंग भाषा) की स्थिति हैं)[1]). बाद की भाषाएँ (उदाहरण के लिए, C++ में) प्रोग्रामर को डिफ़ॉल्ट आर्गुमेंट को निर्दिष्ट करने की अनुमति देती हैं जिनका हमेशा एक मान होता है, यद्यपि फ़ंक्शन को कॉल करते समय कोई निर्दिष्ट नहीं होता हैं।
c ++ में डिफ़ॉल्ट आर्गुमेंट
निम्नलिखित फ़ंक्शन घोषणा पर विचार करें:
int MyFunc(int a, int b, int c = 12);
यह फ़ंक्शन तीन आर्गुमेंट लेता है, जिनमें से अंतिम में बारह का डिफ़ॉल्ट होता है। प्रोग्रामर इस फ़ंक्शन को दो प्रकारो से कॉल कर सकता है:
int result = MyFunc(1, 2, 3);
result = MyFunc(1, 2);
पहली स्थिति में c नामक आर्गुमेंट का मान स्पष्ट रूप से निर्दिष्ट किया गया है। दूसरी स्थिति में, आर्गुमेंट छोड़ दिया जाता है, और इसके अतिरिक्त 12 के डिफ़ॉल्ट मान का उपयोग किया जाता था।
कॉल किए गए फ़ंक्शन के लिए, यह जानने का कोई साधन नहीं है कि कॉल करने वाले द्वारा आर्गुमेंट निर्दिष्ट किया गया है या यदि डिफ़ॉल्ट मान का उपयोग किया गया था।
उपर्युक्त विधि विशेष रूप से तब उपयोगी होती है जब कोई डिफ़ॉल्ट मानदंड सेट करना चाहता है जिससे की फ़ंक्शन को मापदंड के साथ या बिना कॉल किया जा सकता हैं।
निम्न पर विचार करें:
void PrintGreeting(std::ostream& stream = std::cout) {
// This outputs a message to the given stream.
stream << "hello world!";
}
प्रोग्राम कॉल:
PrintGreeting();
डिफ़ॉल्ट रूप से हैलो वर्ल्ड प्रिंट करता हैं ! मानक आउटपुट के लिए std::cout (साधारण तौर पर स्क्रीन)। दूसरी ओर, प्रकार की कोई वस्तु std::ostream अब उसी फ़ंक्शन में पास किया जा सकता है और फ़ंक्शन मानक आउटपुट के स्थान पर दी गई स्ट्रीम पर प्रिंट करता हैं। नीचे दिया गया उदाहरण सेट करता है std::ostream& को std::cerr, और इस प्रकार आउटपुट को मानक त्रुटि स्ट्रीम प्रिंट करता है।
PrintGreeting(std::cerr);
क्योंकि डिफ़ॉल्ट आर्गुमेंट के मान कॉल फ़ंक्शन के मुख्य भाग के के स्थान कॉल साइट पर भरे जाते हैं, वर्चुअल फ़ंक्शंस उनके डिफ़ॉल्ट आर्गुमेंट मानों को पॉइंटर या संदर्भ के स्थिर प्रकार से लेते हैं, जिसके माध्यम से कॉल किया जाता है, अतिरिक्त इसके वर्चुअल फंक्शन बॉडी की आपूर्ति करने वाली वस्तु का गतिशील प्रकार का होता हैं।
struct Base {
virtual std::pair<int, int> Foo(int x = 1) {
return {x, 1};
}
};
struct Derived : public Base {
std::pair<int, int> Foo(int x = 2) override {
return {x, 2};
}
};
int main() {
Derived d;
Base& b = d;
assert(d.Foo() == std::make_pair(2, 2));
assert(b.Foo() == std::make_pair(1, 2));
}
ओवरलोडेड तरीके
कुछ भाषाएँ, जैसे कि जावा (प्रोग्रामिंग भाषा), में डिफ़ॉल्ट तर्क नहीं होते हैं। हालांकि, एक ही नाम के ओवरलोडेड तरीकों को बनाने के लिए विधि अधिभार का उपयोग करके एक ही व्यवहार को सिम्युलेट किया जा सकता है, जो विभिन्न संख्या में तर्क लेते हैं; और कम तर्क वाले संस्करण केवल अधिक तर्क वाले संस्करणों को कॉल करते हैं, डिफ़ॉल्ट तर्कों को लापता तर्कों के रूप में कहते हैं:
int MyFunc(int a, int b) { return MyFunc(a, b, 12); }
int MyFunc(int a, int b, int c) { /* main implementation here */ }
हालाँकि, कई अन्य नुकसान के अलावा, चूंकि डिफ़ॉल्ट तर्कों को टाइप सिस्टम में मॉडल नहीं किया गया है, कॉलबैक का प्रकार (उर्फ उच्च-क्रम फ़ंक्शन) यह व्यक्त नहीं कर सकता कि यह ओवरलोड में से किसी एक को स्वीकार करता है और न ही ओवरलोडेड फ़ंक्शंस के साथ डिफ़ॉल्ट तर्कों का अनुकरण करता है। जबकि, in JavaScript गैर-अतिभारित फ़ंक्शन परिभाषा इनपुट मान होने पर डिफ़ॉल्ट को प्रतिस्थापित कर सकती है undefined (भले ही यह निहित था undefined कॉल साइट पर तर्क की अनुपस्थिति या स्पष्ट रूप से पारित होने के माध्यम से undefined कीमत); जिसे एक वैकल्पिक तर्क पैरामीटर प्रकार के रूप में तैयार किया गया है ?: in TypeScript। जावास्क्रिप्ट का समाधान स्थिर रूप से हल नहीं किया गया है (अर्थात् संकलन-समय पर नहीं, यही कारण है कि टाइपस्क्रिप्ट केवल वैकल्पिकता को मॉडल करता है और फ़ंक्शन के प्रकार हस्ताक्षर में डिफ़ॉल्ट मान नहीं) इस प्रकार अतिरिक्त रनटाइम ओवरहेड होता है, हालांकि यह उस कॉलबैक में अधिक लचीलापन प्रदान करता है, जो इनपुट के फ़ंक्शन के टाइप हस्ताक्षर (कॉलबैक के प्रकार हस्ताक्षर) द्वारा केंद्रीय रूप से निर्धारित करने के बजाय स्वतंत्र रूप से अपने डिफ़ॉल्ट को नियंत्रित कर सकता है। कॉलबैक। टाइपस्क्रिप्ट समाधान जावा में सिम्युलेटेड हो सकता है Optional निहित के अनुरूप को छोड़कर टाइप करें undefined प्रत्येक अनुपस्थित तर्क के लिए एक स्पष्ट है Optional.<Integer>absent() कॉल साइट पर।
मूल्यांकन
प्रत्येक फ़ंक्शन कॉल के लिए डिफ़ॉल्ट तर्क मानों को कॉल किए गए फ़ंक्शन में पास किया जाना चाहिए। यदि एक डिफ़ॉल्ट तर्क मान में साइड-इफेक्ट्स होते हैं, तो यह महत्वपूर्ण है जब उन साइड इफेक्ट्स का मूल्यांकन किया जाता है - पूरे प्रोग्राम के लिए एक बार (पार्स समय पर, संकलन समय, या लोड समय), या एक बार प्रति फ़ंक्शन कॉल, कॉल समय पर।
पायथन एक उल्लेखनीय भाषा है जो फ़ंक्शन घोषणा के मूल्यांकन के समय एक बार डिफ़ॉल्ट तर्कों में अभिव्यक्तियों का मूल्यांकन करती है। यदि प्रति फ़ंक्शन कॉल का मूल्यांकन वांछित है, तो इसे डिफ़ॉल्ट तर्क के रूप में प्रहरी मान होने पर दोहराया जा सकता है, जैसे None, और उसके बाद फ़ंक्शन का मुख्य भाग होने पर डिफ़ॉल्ट मान के साइड इफेक्ट्स का मूल्यांकन केवल तभी किया जाता है जब सेंटीनेल मान पारित किया गया हो।
उदाहरण के लिए:
import random
def eager(a=random.random()):
return a
x = eager()
y = eager()
assert x == y
def lazy(a=None):
if a is None:
a = random.random()
return a
x = lazy()
y = lazy()
assert x != y
विस्तार
आम तौर पर एक डिफ़ॉल्ट तर्क फ़ंक्शन के प्रारंभ में घोषित पैरामीटर या एक स्थानीय चर द्वारा पारित तर्क के समान व्यवहार करेगा, और एक पैरामीटर या अन्य स्थानीय चर के रूप में एक ही गुंजाइश (कंप्यूटर विज्ञान) और सीमा (जीवनकाल) है, अर्थात् एक स्वचालित चर जो फ़ंक्शन टर्मिनेशन पर हटा दिया गया है।
अन्य मामलों में इसके बजाय एक डिफ़ॉल्ट तर्क स्थिर रूप से आवंटित किया जा सकता है। यदि वेरिएबल म्यूटेबल है, तो यह एक स्थैतिक चर के साथ फंक्शन कॉल्स में अपना मान बनाए रखेगा।
यह व्यवहार पायथन में परिवर्तनशील प्रकारों के लिए पाया जाता है, जैसे कि सूचियाँ। मूल्यांकन के साथ, एक स्थानीय चर के समान सीमा सुनिश्चित करने के लिए, एक प्रहरी मूल्य का उपयोग कर सकते हैं:
def eager(a=[]):
return a
x = eager()
x += [1]
assert eager() == [1]
def lazy(a=None):
if a is None:
a = []
return a
x = lazy()
x += [1]
assert lazy() == []
संदर्भ
- ↑ Leslie, Martin. "डिफ़ॉल्ट पैरामीटर।". C++ Programming Reference. Archived from the original on 9 October 2011. Retrieved 2012-01-13.