डार्ट में नामित और स्थितीय मापदंडों के बीच अंतर क्या है?


146

डार्ट वैकल्पिक नामित मापदंडों और स्थितीय वैकल्पिक मापदंडों दोनों का समर्थन करता है। दोनों में क्या मतभेद हैं?

इसके अलावा, आप कैसे बता सकते हैं कि क्या एक वैकल्पिक पैरामीटर वास्तव में निर्दिष्ट किया गया था?

जवाबों:


272

डार्ट के दो प्रकार के वैकल्पिक पैरामीटर हैं: नाम और स्थिति । इससे पहले कि मैं मतभेदों पर चर्चा करूं, पहले मैं समानता पर चर्चा करूं।

डार्ट के वैकल्पिक पैरामीटर वैकल्पिक हैं कि फ़ंक्शन को कॉल करते समय कॉलर को पैरामीटर के लिए एक मूल्य निर्दिष्ट करने की आवश्यकता नहीं है।

वैकल्पिक मापदंडों को किसी भी आवश्यक पैरामीटर के बाद ही घोषित किया जा सकता है।

वैकल्पिक मापदंडों में एक डिफ़ॉल्ट मान हो सकता है, जिसका उपयोग तब किया जाता है जब कोई कॉलर कोई मान निर्दिष्ट नहीं करता है।

स्थितीय वैकल्पिक पैरामीटर

द्वारा लिपटे एक पैरामीटर [ ]एक वैकल्पिक वैकल्पिक पैरामीटर है। यहाँ एक उदाहरण है:

getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

उपरोक्त कोड में, portवैकल्पिक है और इसका डिफ़ॉल्ट मान है 80

आप getHttpUrlतीसरे पैरामीटर के साथ या उसके बिना कॉल कर सकते हैं ।

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

आप एक फ़ंक्शन के लिए कई स्थितीय पैरामीटर निर्दिष्ट कर सकते हैं:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
  // ...
}

वैकल्पिक पैरामीटर हैं स्थितीय में आप छोड़ नहीं कर सकता कि portयदि आप निर्दिष्ट करना चाहते हैं numRetries

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);

बेशक, जब तक आप यह नहीं जानते कि 8080 और 5 क्या हैं, यह बताना मुश्किल है कि वे स्पष्ट रूप से जादू की संख्या क्या हैं। अधिक पठनीय एपीआई बनाने के लिए आप नामांकित वैकल्पिक मापदंडों का उपयोग कर सकते हैं ।

नाम दिया वैकल्पिक पैरामीटर

द्वारा लिपटे एक पैरामीटर { }एक नामित वैकल्पिक पैरामीटर है। यहाँ एक उदाहरण है:

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

आप getHttpUrlतीसरे पैरामीटर के साथ या उसके बिना कॉल कर सकते हैं । आप चाहिए जब फ़ंक्शन को कॉल पैरामीटर नाम का उपयोग करें।

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

आप एक फ़ंक्शन के लिए कई नामित पैरामीटर निर्दिष्ट कर सकते हैं:

getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
  // ...
}

क्योंकि नामित मापदंडों को नाम से संदर्भित किया जाता है, उनका उपयोग उनकी घोषणा से अलग एक क्रम में किया जा सकता है।

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);

मेरा मानना ​​है कि नामित पैरामीटर कॉल-टू-समझने की आसान साइटों के लिए बनाते हैं, खासकर जब बूलियन झंडे या आउट-ऑफ-संदर्भ संख्याएं होती हैं।

वैकल्पिक पैरामीटर प्रदान किया गया था अगर जाँच

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

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

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}

4
? ऑपरेटर को पदावनत कर दिया गया है। मुझे डार्ट ट्यूटोरियल में केवल स्केल == अशक्त स्थिति मिली है। (expr1? expr2: expr3 अभी भी काम करता है)
Zden Mk Mlčoch

1
एक समारोह के लिए कई नामित परमों को प्यार करना, यह मुश्किल था! डॉक्स के निर्माणकर्ता भाग में और भी बेहतर दिखेंगे? ;)
इच्छाशक्ति

1
Dartlang.org/guides/language/… के अनुसार, =इसके बजाय अब डिफ़ॉल्ट मान निर्दिष्ट :किए जाने चाहिए
नबंर

31

मेरी समझ से डार्ट में, विधि पैरामीटर दो प्रकार में दिया जा सकता है।

  • आवश्यक पैरामीटर
  • वैकल्पिक पैरामीटर (स्थिति, नाम और डिफ़ॉल्ट)

>> आवश्यक पैरामीटर

आवश्यक पैरामीटर एक अच्छी तरह से ज्ञात पुरानी शैली पैरामीटर है, जिससे हम सभी परिचित हैं

उदाहरण :

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

उत्पादन:

length = 10, breath = 20, height = 30

>> वैकल्पिक स्थितिगत पैरामीटर

पैरामीटर को वर्ग ब्रैकेट के साथ प्रकट किया जाएगा [] और वर्ग ब्रैकेट पैरामीटर वैकल्पिक हैं।

उदाहरण:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

उत्पादन:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

>> वैकल्पिक नामांकित पैरामीटर

  • पैरामीटर का खुलासा घुंघराले ब्रैकेट के साथ किया जाएगा {}
  • घुंघराले ब्रैकेट पैरामीटर वैकल्पिक हैं।
  • एक मान को असाइन करने के लिए पैरामीटर नाम का उपयोग करना होगा जो कोलन के साथ अलग हो गया है :
  • घुंघराले ब्रैकेटेड पैरामीटर ऑर्डर में कोई फर्क नहीं पड़ता
  • इन प्रकार के पैरामीटर हमें एक फ़ंक्शन के लिए मान पास करते समय भ्रम से बचने में मदद करते हैं जिसमें कई पैरामीटर हैं।

उदाहरण:

findVolume(int length, int breath, {int height}) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,height:30);//valid & we can see the parameter name is mentioned here.
findVolume(10,20);//also valid

उत्पादन:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>> वैकल्पिक डिफ़ॉल्ट पैरामीटर

  • इसके अलावा वैकल्पिक नामित पैरामीटर जैसे हम इस पैरामीटर के लिए डिफ़ॉल्ट मान प्रदान कर सकते हैं।
  • जिसका अर्थ है कि कोई मान पारित नहीं किया गया है, यह डिफ़ॉल्ट मान लिया जाएगा।

उदाहरण:

findVolume(int length, int breath, {int height=10}) {
 print('length = $length, breath = $breath, height = $height');
} 

findVolume(10,20,height:30);//valid
findVolume(10,20);//valid 

उत्पादन:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

इस वीडियो लिंक से दिए गए स्पष्ट स्पष्टीकरण के लिए धन्यवाद, वीडियो निर्माता को क्रेडिट।

वीडियो लिंक: OptionalPositionalParameters

वीडियो लिंक: OptNNamedParameters

वीडियो लिंक: OptionalDefaultParameters


3

जब एक फ़ंक्शन का पैरामीटर "पैरामनेम: वैल्यू" सिंटैक्स का उपयोग करके निर्दिष्ट किया जाता है, तो यह एक नामित पैरामीटर है। ऐसे मापदंडों को [और] कोष्ठक के बीच संलग्न करके वैकल्पिक रूप से प्रस्तुत किया जा सकता है। इस समारोह के अल्पविकसित प्रदर्शन को निम्नलिखित हैलो वर्ल्ड कार्यक्रम में प्रदर्शित किया जा सकता है:

sayHello([String name = ' World!']) {
  print('Hello, ${name}');
}

void main() {
  sayHello('Govind');
}

2

से डॉक पर हम पाते हैं कि दोनों positionalऔर namedपैरामीटर वैकल्पिक हैं, जिसका मतलब है कि वे सभी अनुपस्थित हो सकता है।

मेरी राय में, namedपैरामीटर positionalलोगों की तुलना में अधिक सख्त हैं। उदाहरण के लिए, यदि आप ऐसी विधि की घोषणा करते हैं:

String say({String from, String msg})

ऊपर fromऔर msgकर रहे हैं namedजब आप विधि कॉल, पैरामीटर sayआप का उपयोग करना चाहिए say(from: "xx", msg: "xx")। कुंजियाँ अनुपस्थित नहीं हो सकतीं।

हालाँकि यदि आप स्थितीय मापदंडों का उपयोग करते हैं, तो आप स्वतंत्र हैं।


डॉक्टर कहते हैं:> वैकल्पिक मापदंडों को या तो नाम दिया जा सकता है या स्थितिगत, लेकिन दोनों नहीं। यह कहाँ कहता है कि स्थितिगत पैरामीटर वैकल्पिक हैं?
मार्कॉन

एक स्थितीय पैरामीटर प्रोग्रामिंग भाषाओं में मापदंडों की डिफ़ॉल्ट शैली है, जिसे स्थितीय कहा जाता है क्योंकि "यह पहला पैरामीटर है, या दूसरा, आदि"। Namedमापदंडों को इस तरह से कहा जाता है क्योंकि आप वास्तव में उन्हें नाम से पहचान सकते हैं और स्थिति से नहीं (यदि आप दो नामित पारमों की स्थिति स्विच करते हैं, तो यह नहीं है)। जवाब Savaranaraja से ऊपर देखें
MARKON

0

स्थितिगत पैरामीटर:

वे डिफ़ॉल्ट मापदंडों के समान हैं। उदाहरण के लिए:

void add(int x, [int y = 3]);

यहाँ y का डिफ़ॉल्ट मान 3 है

नामित पैरामीटर:

ये ऐसे पैरामीटर हैं जिन्हें किसी भी क्रम में पारित मूल्य के बाद पैरामीटर के नाम से पारित किया जा सकता है। उदाहरण के लिए:

void sum({int num1, int num2});

इस फ़ंक्शन को इस तरह कहा जाता है:

sum(num1: 12, num2: 24);

इसके अलावा नामित पैरामीटर में डिफ़ॉल्ट मान भी हो सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.