2012-12-04 18 views
14

में अज्ञात चर क्या अंडरस्कोर चर और एक नामित चर के बीच सटीक अंतर हैं जो एरलंग कंपाइलर बिंदु दृश्य (कोड में पठनीयता जोड़ने के अलावा) से अंडरस्कोर से शुरू होता है?एरलांग

उदाहरण के लिए _ और _Var अलग हैं?

उत्तर

20

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

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

याद रखें कि _ वास्तव में एकमात्र विशेष चर है और _Var सामान्य चर हैं और इस तरह इस्तेमाल किए जाने पर व्यवहार करते हैं। यदि आप विकृत महसूस कर रहे हैं तो आप _ के साथ अपने सभी चर को उपसर्ग कर सकते हैं और सबकुछ अभी भी काम करेगा।

+0

धन्यवाद! यह उत्तर के माध्यम से था। :-) – coffeMug

18

आइए उद्धरण यहाँ doc:

गुमनाम चर अंडरस्कोर (_) और से दर्शाया जाता है इस्तेमाल किया जा सकता जब एक चर की आवश्यकता है लेकिन अपने मूल्य पर ध्यान नहीं दिया जा सकता है। [...]

, अंडरस्कोर (_) के साथ शुरू उदाहरण _Height के लिए चर, सामान्य चर हैं, नहीं अनाम: वे फिर भी इस अर्थ में कि वे अप्रयुक्त चर के लिए कोई चेतावनी उत्पन्न नहीं होंगे संकलक द्वारा अनदेखा किया जाता

दूसरे शब्दों में, आप _Var फार्म का उपयोग करें जब आप मेल खाने वाले एक्सप्रेशन मिलान किया जा करने की जरूरत है - लेकिन यह आगे और/या आप अपने अर्थ दिखाने चाहते हैं उपयोग करने के लिए नहीं करना चाहती। और आप _ वैरिएबल का उपयोग करते हैं जब न तो आप और न ही कंपाइलर को उस अभिव्यक्ति की देखभाल करनी चाहिए जो इससे मेल खाती है।

उदाहरण 1:

member(_, []) -> []. 

इस समारोह में काफी स्पष्ट क्या पहले _ मैचों नहीं है। लेकिन यह सीधे पुनर्लेखन, इस तरह:

member(Elem, []) -> []. 

..., एक चेतावनी उत्पन्न होगा अगर कोड झंडा warn_unused_vars सेट के साथ संकलित किया गया है। तुम अब भी तुम यहाँ पठनीय कोड, हालांकि रेखांकित चर का उपयोग करके कर सकते हैं,:

member(_Elem, []) -> []. 

उदाहरण 2:

{_, _, Some} = {1, 2, 3} 

यह टपल मिलान, हालांकि काफी सब ठीक हो जाएगा पहले दो तत्व के रूप में tuple की पूरी तरह से अनदेखा किया जाएगा।

{_Var, _Var, Some} = {1, 2, 3} 

यह मिलान असफल हो जायेगी, फिर भी: हालांकि _Var प्रयोग की जाने वाली एक ही मूल्य के साथ, यह 'भरी' किया जाना चाहिए की जरूरत नहीं होगी! चूंकि 1 2 के बराबर नहीं है, स्थिति यहां विफल हो जाती है।

+0

ठीक है, लेकिन क्या इस तरह के चर का उपयोग न करने का कोई कारण नहीं है कि उनका नाम अंडरस्कोर से शुरू हो? – coffeMug

+0

@AKh_Sw क्योंकि आप अधिकतर _do_ अप्रयुक्त चर के लिए कंपाइलर चेतावनी चाहते हैं, यही कारण है कि यह मौजूद है। –

+1

@AKh_Sw प्रतिक्रिया के अंत में समझाया गया है (उदाहरण 2) यह बैडमैच बना सकता है। कल्पना करें कि आपके पास एक जटिल कोड है, और एक रिफैक्टरिंग के बाद आप पहले इस्तेमाल किए गए चर का उपयोग न करने का निर्णय लेते हैं, लेकिन इस जटिल कोड में यह चर कई बार हुआ। आप बस इसे इस्तेमाल करने के लिए _ डालते हैं लेकिन वास्तव में इसका उपयोग किया जाता है। फिर आप अप्रत्याशित Badmatch हो सकता है। इसके अलावा, कोड को दस्तावेज़ करने के लिए उन अंडरस्कोर चर का उपयोग करने की आवश्यकता को कभी-कभी "कोड गंध" और इसे सरल बनाने के लिए आमंत्रण के रूप में माना जाता है। –