ES6 / टाइपस्क्रिप्ट में तीर कार्यों के साथ _ (अंडरस्कोर) चर का उपयोग करना


119

मैं इस निर्माण में एक कोणीय उदाहरण में आया था और मुझे आश्चर्य है कि इसे क्यों चुना गया है:

_ => console.log('Not using any parameters');

मैं समझता हूं कि चर _ का मतलब परवाह नहीं / उपयोग नहीं है, लेकिन चूंकि यह एकमात्र चर है इसलिए _ के उपयोग को पसंद करने का कोई कारण नहीं है:

() => console.log('Not using any parameters');

निश्चित रूप से यह एक प्रकार से कम वर्ण के बारे में नहीं हो सकता है। () सिंटैक्स मेरी राय में इरादे को बेहतर बताता है और यह अधिक विशिष्ट भी है क्योंकि अन्यथा मुझे लगता है कि पहला उदाहरण इस तरह होना चाहिए:

(_: any) => console.log('Not using any parameters');

मामले में यह मायने रखता है, यह वह संदर्भ था जहां इसका इस्तेमाल किया गया था:

submit(query: string): void {
    this.router.navigate(['search'], { queryParams: { query: query } })
      .then(_ => this.search());
}


1
जिस पैरामीटर का उपयोग कभी नहीं किया जाता है, उसके लिए आपको टाइपिंग या विशिष्टता के बारे में चिंता कैसे हो सकती है?

3
मैं व्यापार द्वारा C ++ डेवलपर हूं इसलिए मुझे लगता है कि मैं हमेशा टाइप विशिष्टता के बारे में चिंतित हूं।
हाल्ट

6
व्यक्तिगत रूप से, _ => पैटर्न कोष्ठक की संख्या को कम करने के लिए आसान बनाता है: doStuff ()। तब ((= = कार्रवाई) () बनाम doStuff ()। तब (_ => कार्रवाई ())।
डेमियन गोल्डिंग

जवाबों:


93

इस शैली का उपयोग किस कारण से किया जा सकता है (और संभवतः इसका उपयोग यहां क्यों किया गया) वह यह _है कि एक वर्ण इससे छोटा है ()

वैकल्पिक कोष्ठक वैकल्पिक घुंघराले कोष्ठक के रूप में एक ही शैली के मुद्दे में आते हैं । यह अधिकांश भाग के लिए स्वाद और कोड शैली का मामला है, लेकिन निरंतरता के कारण क्रियाशीलता का पक्षधर है।

जबकि तीर फ़ंक्शन कोष्ठक के बिना एकल पैरामीटर की अनुमति देते हैं, यह शून्य के साथ असंगत है, एकल विनाशकारी, एकल आराम और कई पैरामीटर:

let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };

हालांकि टाइप किए गए मापदंडों के लिए टाइपस्क्रिप्ट 2.0 मेंis declared but never used त्रुटि को ठीक किया गया था, लेकिन एक लाइनर या आईडीई से चेतावनी को _भी ट्रिगर किया जा सकता है unused variable/parameter। ऐसा करने के खिलाफ यह एक विचारणीय तर्क है।

_नजरअंदाज किए गए मापदंडों के लिए पारंपरिक रूप से इस्तेमाल किया जा सकता है (जैसा कि पहले से ही समझाया गया अन्य उत्तर)। हालांकि इसे स्वीकार्य माना जा सकता है, इस आदत के परिणामस्वरूप _अंडरस्कोर / लोदश नाम स्थान के साथ संघर्ष हो सकता है , यह भी भ्रमित हो सकता है जब कई उपेक्षित पैरामीटर हैं। इस कारण से अंडरस्कोर पैरामीटर (टीएस 2.0 में समर्थित) का ठीक से नाम रखना फायदेमंद है, यह फंक्शन सिग्नेचर का पता लगाने में भी समय की बचत करता है और पैरामीटर को अनदेखा क्यों किया जाता है (यह _शॉर्टकट के रूप में पैरामीटर के उद्देश्य को धता बताता है ):

let fn = (param1, _unusedParam2, param3) => { ... };

ऊपर सूचीबद्ध कारणों के लिए, मैं व्यक्तिगत रूप से _ => { ... }कोड शैली को एक बुरा स्वर मानूंगा, जिसे टाला जाना चाहिए।


1
यह एक वर्ण छोटा है, लेकिन अधिकांश IDE के लिए यह समान मात्रा का है, क्योंकि (आमतौर पर दबाने पर यह एक के साथ आता है )। मैं व्यक्तिगत रूप से pपैरामीटर के लिए उपयोग करना पसंद करता हूं, मुझे आश्चर्य है कि अगर इसमें कोई प्रदर्शन मुद्दा है
Mojimi

68

()वाक्य रचना मंशा बेहतर imho बता देते हैं और यह भी अधिक प्रकार विशिष्ट है

बिल्कुल नहीं। ()का कहना है कि फ़ंक्शन किसी भी तर्क की उम्मीद नहीं करता है, यह किसी भी पैरामीटर की घोषणा नहीं करता है। फ़ंक्शन का .length0 है।

यदि आप उपयोग करते हैं _, तो यह स्पष्ट रूप से बताता है कि फ़ंक्शन को एक तर्क पास किया जाएगा, लेकिन आप इसके बारे में परवाह नहीं करते हैं। फ़ंक्शन की .lengthसंख्या 1 होगी, जो कुछ रूपरेखाओं में हो सकती है।

तो एक प्रकार के दृष्टिकोण से, यह करने के लिए और अधिक सटीक बात हो सकती है (विशेषकर जब आप इसे टाइप नहीं करते हैं anyलेकिन कहते हैं, _: Event)। और जैसा कि आपने कहा, यह एक प्रकार से कम वर्ण है जो कुछ कीबोर्ड पर पहुंचना भी आसान है।


6
मेरा पहला विचार यह था कि _ यह केवल सम्मेलन द्वारा स्पष्ट करता है कि फ़ंक्शन को समझने की कोशिश करते समय विचार करने के लिए कोई तर्क नहीं हैं। उपयोग () यह स्पष्ट करता है, _ के संभावित उपयोग के लिए कोड को स्कैन करने की कोई आवश्यकता नहीं है (जो सम्मेलन का उल्लंघन करेगा)। लेकिन आपने मेरी आंखें खोल दीं ताकि यह भी ध्यान दिया जा सके कि दस्तावेज के मूल्य समारोह में पारित किए गए मूल्य हैं, जो अन्यथा हमेशा स्पष्ट नहीं होंगे।
हॉल्ट

मुझे बस एहसास हुआ कि मेरा कोड अप्रयुक्त _s एरो फंक्शन वेरिएबल्स से भरा है , मुझे आश्चर्य है कि अगर उपयोग करने की तुलना में कोई प्रदर्शन अंतर है()
Mojimi

24

मुझे लगता _ =>है कि इसका इस्तेमाल सिर्फ () =>इसलिए किया जाता है क्योंकि _यह अन्य भाषाओं में आम है जहां इसे जेएस की तरह सिर्फ ऑमिट मापदंडों की अनुमति नहीं है।

_ गो में लोकप्रिय है और इसका उपयोग डार्ट में भी किया जाता है ताकि एक पैरामीटर को अनदेखा किया जा सके।


4
पायथन भी इस सम्मेलन का अनुसरण करता है, मुझे लगता है।
Jaime RGP

7
इसका उपयोग _संभवतः एमएल और हास्केल जैसी कार्यात्मक भाषाओं से उधार लिया गया था, जहां यह लंबे समय से पायथन के आविष्कार (पहले जाने दें, डार्ट, या टाइपस्क्रिप्ट) के लिए प्रेरित करता है।
रुख

1
रूबी भी ऐसा करती है ( po-ru.com/diary/rubys-magic-underscore ) और F # भी (और एमएल परिवार से प्रभावित अन्य भाषाएं)
Mariusz Pawelski

स्काला को अंडरस्कोर ( इनहेल्प्ड . com/scala/use-of- underscore- in-scala.aspx ) बहुत पसंद है। स्केला ने अंडरस्कोर के साथ गुमनाम प्रकारों के साथ क्या कर रही है, इसके बाद और कौन सी भाषाएं लीं।
सैम

मुझे लगता है कि स्काला ने इसे किसी अन्य भाषा से भी लिया है। प्रोग्रामिंग भाषाओं में शायद ही कुछ है जो 70 के दशक में पहले से मौजूद नहीं था: डी ज्यादातर सामान को संयोजित करने के नए तरीके।
गुंटर ज़ोचबॉयर

11

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

इस तरह के भेदभाव नीचे दिए गए उदाहरण की तरह दिख सकते हैं:

const f1 = () => { } // A function taking no arguments
const f2 = _ => { }  // A function with one argument that doesn't use it

function h(ff) { 
  if (ff.length === 0) {
    console.log("No argument function - calling directly");
    ff();
  } else if (ff.length === 1) {
    console.log("Single argument function - calling with 1");
    ff(1);
  }
}

h(f1);
h(f2);


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

0

जब मैंने पोस्ट लिखी थी तो मैं इस धारणा के तहत _था कि बिना तीर के कार्य करना ही एकमात्र तरीका है (), जिसके कारण मुझे विश्वास है कि _कुछ मामूली फायदे हो सकते हैं, लेकिन मैं गलत था। @ हॉल्ट ने टिप्पणियों में पुष्टि की है कि यह अन्य चर की तरह ही व्यवहार करता है, यह एक विशेष भाषा निर्माण नहीं है।


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

उदाहरण:

// simple number doubling function
f = _=> {
    _ = _ * 2;
    return _;
}

console.log(f(2)); // returns 4
console.log(f(10)); // returns 20

Chrome कंसोल के साथ परीक्षण किया गया, संस्करण 76.0.3809.132 (आधिकारिक बिल्ड) (64-बिट)


1
अंडरस्कोर '_' एक कानूनी चर नाम है और विशेष भाषा का निर्माण नहीं है, केवल सम्मेलन द्वारा विशेष अर्थ दिया जाता है। अप्रयुक्त मापदंडों के बारे में लिंटर चेतावनी को अंडरस्कोर उपसर्ग का उपयोग करके चुप कराया जा सकता है। मुझे लगता है कि _ अपने आप को अप्रयुक्त कहने का सबसे छोटा तरीका है।
हॉल्ट

@ हॉल्ट, स्पष्टीकरण के लिए धन्यवाद, सुनिश्चित करने के लिए अच्छा है। मुझे वास्तव में यह एहसास नहीं था कि ()इस पोस्ट को बनाने से पहले आप बिना तीर के काम कर सकते हैं , मैंने सोचा _कि यह एकमात्र तरीका था, यही वजह है कि मैंने इसे इंगित करने का फैसला किया। यह ध्यान में रखते हुए कि यह गोल्फ के लिए भी उपयोग करने के लिए कुछ खास नहीं है, क्योंकि आप बस एक नियमित चरित्र का उपयोग कर सकते हैं। जैसा कि आपने कहा था, केवल सम्मेलनों का पालन करने के लिए बेहतर उपयोग किया जाता है।
मत्स्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.