15

मैंने देखा है कि वैकल्पिक पैरामीटर का समर्थन करने वाली सभी प्रोग्रामिंग भाषाओं में एक अनुकरण है कि वैकल्पिक पैरामीटर घोषणा के अंत में दिखाई देना चाहिए। वैकल्पिक आइटम के बाद कोई आवश्यक पैरामीटर शामिल नहीं किया जा सकता है। इसका कारण क्या है? मुझे लगता है कि यह संकलक/दुभाषिया आवश्यकता हो सकती है।घोषणा के अंत में वैकल्पिक पैरामीटर क्यों दिखना चाहिए

उत्तर

16

ठीक है, अगर वे सामने थे, तो आप कब आपूर्ति कर रहे थे जब आप पता लगाएंगे? एकमात्र तरीका यह होगा कि परिवर्तनीय प्रकार वैकल्पिक पैरामीटर के बाद अलग था। एक अजीब आवश्यकता के बिट, इसलिए यह समझ में आता है कि आप उन्हें अंतिम होने के लिए मजबूर करते हैं ("अंतिम" वैकल्पिक पैरामीटर का पता लगाने के लिए जटिल नियमों की परेशानी को बचाएं)।

इसके अलावा, यह फ़ंक्शन को कॉल करते समय इसे करने का सबसे स्वाभाविक तरीका है।

+0

हाँ यह अब इतना स्पष्ट दिखता है :)। धन्यवाद। – Incognito

+0

@ गुप्त: यह रूबी में ठीक काम करता है। यदि वैकल्पिक लोगों के बाद अनिवार्य पैरामीटर हैं, तो अनिवार्य तर्क तर्क सूची के अंत से लिया जाता है। सब कुछ छोड़ दिया वैकल्पिक तर्क हैं। उदाहरण के लिए http://StackOverflow.Com/questions/2896106/why-optional-parameters-must-appear-at-the-end-of-the-declaration/2900474/#2900474 देखें। –

0

बस जंगली में अनुमान लगा रहा है: हो सकता है कि कॉलिंग सम्मेलनों के साथ ऐसा कुछ हो (उदाहरण के लिए पैरामीटर को बाएं से दाएं दाएं धक्का दिया जाता है, वैकल्पिक पैरामीटर बस निर्दिष्ट किए जाने पर छोड़ दिए जाते हैं)।

+1

मुझे संदेह होगा कि, मुझे लगता है कि कॉलर इसके बजाय डिफ़ॉल्ट मानों को धक्का देगा। – tstenner

-1

जावा और सी # मापदंडों नामित नहीं है तो आप ऐसा नहीं कर सकते:

myfunction(param1='Meh', optionalParam=2) 

आप क्या करना है:

myfunction('Meh', 2) 

अन्यथा

myFunction(2, 'Meh') 

अस्पष्ट है। संकलक को यह कैसे पता होना चाहिए कि आपके पास वैकल्पिक पैरामीटर सेट में 2 होना चाहिए?

+7

सी # 4.0 ने पैरामीटर नाम दिए हैं। – Incognito

0

अंत में वैकल्पिक पैरामीटर आपको कुछ बिंदुओं पर पैरामीटर निर्दिष्ट करना बंद करने की अनुमति देते हैं, उदा।

void Test(int a, optional int b = 0, optional int c = 0) { ... } 

Test(3); 

आप c एक आवश्यक पैरामीटर बनाने हैं, तो आप इस तरह वाक्यविन्यास का उपयोग करना चाहते हैं:

Test(3, , 2); 
Test(a := 3, c := 2); 

एक वैकल्पिक पैरामीटर का लाभ यह है इलाज किया जा सकता है जैसे कि यह wasn है टी। यदि वैकल्पिक पैरामीटर पैरामीटर सूची के मध्य में हैं, तो "कॉमा गिनती" या अत्यधिक ओवरबॉस सिंटैक्स का उपयोग किए बिना यह संभव नहीं है।

+1

यह रूबी में ठीक काम करता है। पैरामीटर सूची की शुरुआत में अनिवार्य पैरामीटर तर्क सूची की शुरुआत से बाएं से दाएं बाध्य हैं। पैरामीटर सूची के अंत में अनिवार्य पैरामीटर तर्क सूची के अंत से दाएं से बाएं से बाध्य हैं। वैकल्पिक पैरामीटर शेष तर्क सूची की शुरुआत से बाएं से दाएं बाध्य हैं। छोड़ दिया गया सभी तर्क तर्कों को आराम करने के लिए बाध्य हैं। जब कोई आराम पैरामीटर नहीं होता है तो अनिवार्य तर्क की आपूर्ति नहीं होती है या 'num_mandatory + num_optional' तर्कों से अधिक की आपूर्ति नहीं होती है। –

2

पर विचार की तरह एक घोषणा:

int foo(float a, int b=0, int c=0, float d); 

(ध्यान दें कि किस मैं सूची के बीच में defult पैरामीटर परिभाषित किया है) जो बाद में की तरह

foo(0.0,1,2.0) 

कॉल क्या है कहा जाता है? विशेष रूप से b या c छोड़ा गया है?

संकलक डिजाइनरों नाम वाले पैरामीटर

foo(a=0,c=0,d=2.0) 

एक विशेषता उदाहरण के लिए अजगर में उपलब्ध का उपयोग करके यह मिल सकता है।

+1

यह सुविधा सी #: foo (a: 0, c: 0, d: 2.0) में भी उपलब्ध है। समस्या तब होती है जब स्थितित्मक कॉल किए जाते हैं। – configurator

+2

यह रूबी में ठीक काम करता है। पैरामीटर सूची की शुरुआत में अनिवार्य पैरामीटर तर्क सूची की शुरुआत से बाएं से दाएं बाध्य हैं। पैरामीटर सूची के अंत में अनिवार्य पैरामीटर तर्क सूची के अंत से दाएं से बाएं से बाध्य हैं। वैकल्पिक पैरामीटर शेष तर्क सूची की शुरुआत से बाएं से दाएं बाध्य हैं। छोड़ दिया गया सभी तर्क तर्कों को आराम करने के लिए बाध्य हैं। जब कोई आराम पैरामीटर नहीं होता है तो अनिवार्य तर्क की आपूर्ति नहीं होती है या 'num_mandatory + num_optional' तर्कों से अधिक की आपूर्ति नहीं होती है। –

+0

आपके विशिष्ट उदाहरण में, 'ए' '0.0',' d' से '2.0',' b' से '1' तक सीमित होगा और' c' को '0' का डिफ़ॉल्ट मान मिलेगा। –

5

यह केवल एक मनमाना नियम है कि उन विशिष्ट भाषाओं के डिजाइनरों ने बनाया है।बिल्कुल कोई तकनीकी कारण नहीं है कि वह प्रतिबंध क्यों होना चाहिए।

यह रूबी में बस ठीक काम करता है:

def foo(m1, m2, o1='o1', o2='o2', *rest, m3, m4) 
    return m1, m2, o1, o2, rest, m3, m4 
end 

foo(1, 2, 3, 4) 
# => [1, 2, 'o1', 'o2', [], 3, 4] 

foo(1, 2, 3, 4, 5) 
# => [1, 2, 3, 'o2', [], 4, 5] 

foo(1, 2, 3, 4, 5, 6) 
# => [1, 2, 3, 4, [], 5, 6] 

foo(1, 2, 3, 4, 5, 6, 7) 
# => [1, 2, 3, 4, [5], 6, 7] 

foo(1, 2, 3, 4, 5, 6, 7, 8) 
# => [1, 2, 3, 4, [5, 6], 7, 8] 

सभी अनिवार्य तर्क की आपूर्ति की जानी चाहिए:

:

foo(1, 2, 3) 
# => ArgumentError: wrong number of arguments (3 for 4) 

बाकी पैरामीटर के बिना, number_of_mandatory + number_of_optional तर्कों की तुलना में अधिक आपूर्ति एक त्रुटि है

def bar(m1, m2, o1='o1', o2='o2', m3, m4) 
    return m1, m2, o1, o2, m3, m4 
end 

bar(1, 2, 3, 4, 5, 6, 7) 
# => ArgumentError: wrong number of arguments (7 for 6) 

समानता की शुरुआत में अनिवार्य पैरामीटर टेर सूची तर्क सूची की शुरुआत से बाएं से दाएं बाध्य हैं। पैरामीटर सूची के अंत में अनिवार्य पैरामीटर तर्क सूची के अंत से दाएं से बाएं से बाध्य हैं। वैकल्पिक पैरामीटर शेष तर्क सूची की शुरुआत से बाएं से दाएं बाध्य हैं। छोड़ दिया गया सभी तर्क तर्कों को आराम करने के लिए बाध्य हैं।

+0

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

+0

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