दिस (THIS कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{short description|In programming languages, the object or class the currently running code belongs to}}
{{short description|In programming languages, the object or class the currently running code belongs to}}
यह, स्वयं, और मी [[आरक्षित शब्द]] हैं जिनका उपयोग कुछ '''कंप्यूटर [[प्रोग्रामिंग भाषा|प्रोग्रामिंग]]''' [[प्रोग्रामिंग भाषा|भाषा]]ओं में ऑब्जेक्ट, क्लास या अन्य इकाई को संदर्भित करने के लिए किया जाता है जिसका वर्तमान में चल रहा कोड हिस्सा है। इन कीवर्ड द्वारा संदर्भित इकाई इस प्रकार निष्पादन संदर्भ पर निर्भर करती है (जैसे कि किस ऑब्जेक्ट की विधि कहलाती है)। अलग-अलग प्रोग्रामिंग भाषाएं इन कीवर्ड का उपयोग थोड़े अलग तरीके से करती हैं। उन भाषाओं में जहां इस तरह का कीवर्ड अनिवार्य है, कीवर्ड वर्तमान ऑब्जेक्ट में संग्रहीत डेटा और विधियों तक पहुंचने का एकमात्र तरीका है। जहां वैकल्पिक हो, वे ही नाम से वेरिएबल और फ़ंक्शंस को स्पष्ट कर सकते हैं।
यह, स्वयं, और मी [[आरक्षित शब्द]] हैं जिनका उपयोग कुछ '''कंप्यूटर [[प्रोग्रामिंग भाषा|प्रोग्रामिंग]]''' [[प्रोग्रामिंग भाषा|भाषा]]ओं में ऑब्जेक्ट, क्लास या अन्य इकाई को संदर्भित करने के लिए किया जाता है जिसका वर्तमान में चल रहा कोड हिस्सा है। इन कीवर्ड द्वारा संदर्भित इकाई इस प्रकार निष्पादन संदर्भ पर निर्भर करती है (जैसे कि किस ऑब्जेक्ट की विधि कहलाती है)। अलग-अलग प्रोग्रामिंग भाषाएं इन कीवर्ड का उपयोग थोड़े अलग तरीके से करती हैं। उन भाषाओं में जहां इस तरह का कीवर्ड अनिवार्य है, कीवर्ड वर्तमान ऑब्जेक्ट में संग्रहीत डेटा और विधियों तक पहुंचने का एकमात्र प्रणाली है। जहां वैकल्पिक हो, वे ही नाम से वेरिएबल और फ़ंक्शंस को स्पष्ट कर सकते हैं।
=='''वस्तु-उन्मुख प्रोग्रामिंग'''==
=='''वस्तु-उन्मुख प्रोग्रामिंग'''==
कई [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]]|ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, <code>this</code> (यह भी कहा जाता है <code>self</code> या <code>Me</code>) वेरिएबल है जिसका उपयोग इंस्टेंस विधियों में उस ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है जिस पर वे काम कर रहे हैं। पहली OO भाषा, [[ शुरुआत ]], का उपयोग किया गया <code>this</code> स्थानीय वस्तु को स्पष्ट रूप से संदर्भित करने के लिए।<ref>{{cite web |last1=Dahl |first1=Ole-Johan |author-link=Ole-Johan Dahl |last2=Myhrhaug |first2=Bjørn |last3=Nygaard |first3=Kristen |author3-link=Kristen Nygaard |date=1970 |url=http://www.edelweb.fr/Simula/#7 |title=Common Base Language, Norwegian Computing Center}}</ref>{{rp|4.3.2.3}} [[C++]] और इससे शैली में व्युत्पन्न भाषाएं (जैसे [[जावा (प्रोग्रामिंग भाषा)]], सी शार्प (प्रोग्रामिंग भाषा)|सी#, [[डी (प्रोग्रामिंग भाषा)]], और [[पीएचपी]]) भी आम तौर पर उपयोग की जाती हैं <code>this</code>. स्मॉलटॉक और अन्य, जैसे [[ऑब्जेक्ट पास्कल]], [[पर्ल]], [[पायथन (प्रोग्रामिंग भाषा)]], [[रूबी (प्रोग्रामिंग भाषा)]], रस्ट (प्रोग्रामिंग भाषा), [[ उद्देश्य सी ]], [[डेटाफ्लेक्स]] और [[स्विफ्ट (प्रोग्रामिंग भाषा)]], उपयोग करें <code>self</code>. माइक्रोसॉफ्ट के [[मूल दृश्य]] का उपयोग करता है <code>Me</code>.
कई [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]]|ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, <code>this</code> (यह भी कहा जाता है <code>self</code> या <code>Me</code>) वेरिएबल है जिसका उपयोग इंस्टेंस विधियों में उस ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है जिस पर वे काम कर रहे हैं। पहली OO भाषा, [[ शुरुआत ]], का उपयोग किया गया <code>this</code> स्थानीय वस्तु को स्पष्ट रूप से संदर्भित करने के लिए।<ref>{{cite web |last1=Dahl |first1=Ole-Johan |author-link=Ole-Johan Dahl |last2=Myhrhaug |first2=Bjørn |last3=Nygaard |first3=Kristen |author3-link=Kristen Nygaard |date=1970 |url=http://www.edelweb.fr/Simula/#7 |title=Common Base Language, Norwegian Computing Center}}</ref>{{rp|4.3.2.3}} [[C++]] और इससे शैली में व्युत्पन्न भाषाएं (जैसे [[जावा (प्रोग्रामिंग भाषा)]], सी शार्प (प्रोग्रामिंग भाषा)|सी#, [[डी (प्रोग्रामिंग भाषा)]], और [[पीएचपी]]) भी सामान्यतः उपयोग की जाती हैं <code>this</code>. स्मॉलटॉक और अन्य, जैसे [[ऑब्जेक्ट पास्कल]], [[पर्ल]], [[पायथन (प्रोग्रामिंग भाषा)]], [[रूबी (प्रोग्रामिंग भाषा)]], रस्ट (प्रोग्रामिंग भाषा), [[ उद्देश्य सी ]], [[डेटाफ्लेक्स]] और [[स्विफ्ट (प्रोग्रामिंग भाषा)]], उपयोग करें <code>self</code>. माइक्रोसॉफ्ट के [[मूल दृश्य]] का उपयोग करता है <code>Me</code>.


यह अवधारणा सभी भाषाओं में समान है: <code>this</code> आमतौर पर अपरिवर्तनीय [[संदर्भ (कंप्यूटर विज्ञान)]] या [[ सूचक (कंप्यूटर प्रोग्रामिंग) ]] है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अक्सर वह कोड होता है जो [[ संपत्ति (प्रोग्रामिंग) ]], [[ विधि (कंप्यूटर प्रोग्रामिंग) ]], सब-रूटीन या फ़ंक्शन के लिए 'पैरेंट' या 'इनवॉकेंट' के रूप में कार्य करता है जिसमें शामिल होता है <code>this</code> कीवर्ड. किसी वस्तु के ठीक से निर्माण या त्वरितीकरण के बाद, <code>this</code> हमेशा वैध संदर्भ होता है. कुछ भाषाओं को स्पष्ट रूप से इसकी आवश्यकता होती है; अन्य लोग अपने वर्ग के प्रतीकों को दृश्यमान बनाने के लिए इसका अंतर्निहित रूप से उपयोग करने के लिए [[ शाब्दिक दायरा ]] का उपयोग करते हैं। या वैकल्पिक रूप से, वर्तमान वस्तु द्वारा संदर्भित <code>this</code> स्वतंत्र कोड ऑब्जेक्ट हो सकता है जिसने कीवर्ड वाले फ़ंक्शन या विधि को कॉल किया हो <code>this</code>. ऐसी बात होती है, उदाहरण के लिए, जब किसी वेब पेज में HTML टैग से जुड़ा [[जावास्क्रिप्ट]] ईवेंट हैंडलर कीवर्ड वाले फ़ंक्शन को कॉल करता है <code>this</code> दस्तावेज़ ऑब्जेक्ट के बाहर वैश्विक स्थान में संग्रहीत; उस संदर्भ में, <code>this</code> दस्तावेज़ ऑब्जेक्ट के भीतर पृष्ठ तत्व को संदर्भित करेगा, संलग्न विंडो ऑब्जेक्ट को नहीं।<ref>Powell, Thomas A, and Schneider, Fritz, 2012. ''JavaScript: The Complete Reference, Third Edition.'' McGraw-Hill. Chapter 11, ''Event Handling'', p 428. {{ISBN|978-0-07-174120-0}}</ref>
यह अवधारणा सभी भाषाओं में समान है: <code>this</code> सामान्यतः अपरिवर्तनीय [[संदर्भ (कंप्यूटर विज्ञान)]] या [[ सूचक (कंप्यूटर प्रोग्रामिंग) ]] है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अधिकांशतः वह कोड होता है जो [[ संपत्ति (प्रोग्रामिंग) ]], [[ विधि (कंप्यूटर प्रोग्रामिंग) ]], सब-रूटीन या फ़ंक्शन के लिए 'पैरेंट' या 'इनवॉकेंट' के रूप में कार्य करता है जिसमें सम्मिलित होता है <code>this</code> कीवर्ड. किसी वस्तु के ठीक से निर्माण या त्वरितीकरण के बाद, <code>this</code> हमेशा वैध संदर्भ होता है. कुछ भाषाओं को स्पष्ट रूप से इसकी आवश्यकता होती है; अन्य लोग अपने वर्ग के प्रतीकों को दृश्यमान बनाने के लिए इसका अंतर्निहित रूप से उपयोग करने के लिए [[ शाब्दिक दायरा ]] का उपयोग करते हैं। या वैकल्पिक रूप से, वर्तमान वस्तु द्वारा संदर्भित <code>this</code> स्वतंत्र कोड ऑब्जेक्ट हो सकता है जिसने कीवर्ड वाले फ़ंक्शन या विधि को कॉल किया हो <code>this</code>. ऐसी बात होती है, उदाहरण के लिए, जब किसी वेब पेज में HTML टैग से जुड़ा [[जावास्क्रिप्ट]] ईवेंट हैंडलर कीवर्ड वाले फ़ंक्शन को कॉल करता है <code>this</code> दस्तावेज़ ऑब्जेक्ट के बाहर वैश्विक स्थान में संग्रहीत; उस संदर्भ में, <code>this</code> दस्तावेज़ ऑब्जेक्ट के भीतर पृष्ठ तत्व को संदर्भित करेगा, संलग्न विंडो ऑब्जेक्ट को नहीं।<ref>Powell, Thomas A, and Schneider, Fritz, 2012. ''JavaScript: The Complete Reference, Third Edition.'' McGraw-Hill. Chapter 11, ''Event Handling'', p 428. {{ISBN|978-0-07-174120-0}}</ref>
कुछ भाषाओं में, उदाहरण के लिए C++, Java और Raku <code>this</code> या <code>self</code> [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] है, और वेरिएबल स्वचालित रूप से इंस्टेंस विधियों में मौजूद होता है। दूसरों में, उदाहरण के लिए पायथन, रस्ट और पर्ल 5 में, इंस्टेंस विधि का पहला पैरामीटर ऐसा संदर्भ है। इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। पायथन और पर्ल में, पैरामीटर को आवश्यक रूप से नाम देने की आवश्यकता नहीं है <code>this</code> या <code>self</code>; इसे किसी अन्य पैरामीटर की तरह प्रोग्रामर द्वारा स्वतंत्र रूप से नामित किया जा सकता है। हालाँकि, अनौपचारिक परंपरा के अनुसार, पर्ल या पायथन में इंस्टेंस विधि के पहले पैरामीटर का नाम दिया जाता है <code>self</code>. जंग के लिए स्वयं वस्तु को बुलाए जाने की आवश्यकता होती है <code>&self</code> या <code>self</code>, इस पर निर्भर करता है कि क्या आह्वान किया गया फ़ंक्शन आह्वानकर्ता को उधार लेता है, या उसे क्रमशः अंदर ले जाता है।
कुछ भाषाओं में, उदाहरण के लिए C++, Java और Raku <code>this</code> या <code>self</code> [[कीवर्ड (कंप्यूटर प्रोग्रामिंग)]] है, और वेरिएबल स्वचालित रूप से इंस्टेंस विधियों में उपस्तिथ होता है। दूसरों में, उदाहरण के लिए पायथन, रस्ट और पर्ल 5 में, इंस्टेंस विधि का पहला पैरामीटर ऐसा संदर्भ है। इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। पायथन और पर्ल में, पैरामीटर को आवश्यक रूप से नाम देने की आवश्यकता नहीं है <code>this</code> या <code>self</code>; इसे किसी अन्य पैरामीटर की तरह प्रोग्रामर द्वारा स्वतंत्र रूप से नामित किया जा सकता है। चूँकि, अनौपचारिक परंपरा के अनुसार, पर्ल या पायथन में इंस्टेंस विधि के पहले पैरामीटर का नाम दिया जाता है <code>self</code>. जंग के लिए स्वयं वस्तु को बुलाए जाने की आवश्यकता होती है <code>&self</code> या <code>self</code>, इस पर निर्भर करता है कि क्या आह्वान किया गया फ़ंक्शन आह्वानकर्ता को उधार लेता है, या उसे क्रमशः अंदर ले जाता है।


C++ या Java में स्टेटिक विधियाँ उदाहरणों से नहीं बल्कि कक्षाओं से संबद्ध हैं, और इसलिए उनका उपयोग नहीं किया जा सकता है <code>this</code>, क्योंकि कोई वस्तु नहीं है। अन्य भाषाओं में, जैसे रूबी, स्मॉलटॉक, ऑब्जेक्टिव-सी, या स्विफ्ट, विधि क्लास ऑब्जेक्ट से जुड़ी होती है जिसे इस प्रकार पारित किया जाता है <code>this</code>, और उन्हें क्लास विधियाँ कहा जाता है। क्लास विधियों के लिए, पायथन का उपयोग किया जाता है <code>cls</code> क्लास ऑब्जेक्ट तक पहुंचने के लिए।
C++ या Java में स्टेटिक विधियाँ उदाहरणों से नहीं किंतु कक्षाओं से संबद्ध हैं, और इसलिए उनका उपयोग नहीं किया जा सकता है <code>this</code>, क्योंकि कोई वस्तु नहीं है। अन्य भाषाओं में, जैसे रूबी, स्मॉलटॉक, ऑब्जेक्टिव-सी, या स्विफ्ट, विधि क्लास ऑब्जेक्ट से जुड़ी होती है जिसे इस प्रकार पारित किया जाता है <code>this</code>, और उन्हें क्लास विधियाँ कहा जाता है। क्लास विधियों के लिए, पायथन का उपयोग किया जाता है <code>cls</code> क्लास ऑब्जेक्ट तक पहुंचने के लिए।


=='''बारीकियाँ और कठिनाइयाँ'''==
=='''बारीकियाँ और कठिनाइयाँ'''==
जब अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है <code>this</code>, का उपयोग <code>this</code> कोड में, हालांकि यह अवैध नहीं है, यह रखरखाव प्रोग्रामर के लिए चेतावनी की घंटी बजा सकता है, हालांकि इसके अभी भी वैध उपयोग हैं <code>this</code> इस मामले में, जैसे कि ही नाम के स्थानीय चर द्वारा छिपे हुए उदाहरण चर का संदर्भ देना, या यदि विधि वर्तमान ऑब्जेक्ट का संदर्भ वापस करना चाहती है, यानी। <code>this</code>, अपने आप।
जब अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है <code>this</code>, का उपयोग <code>this</code> कोड में, चूंकि यह अवैध नहीं है, यह रखरखाव प्रोग्रामर के लिए चेतावनी की घंटी बजा सकता है, चूंकि इसके अभी भी वैध उपयोग हैं <code>this</code> इस मामले में, जैसे कि ही नाम के स्थानीय चर द्वारा छिपे हुए उदाहरण चर का संदर्भ देना, या यदि विधि वर्तमान ऑब्जेक्ट का संदर्भ वापस करना चाहती है, अर्थात। <code>this</code>, अपने आप।


कुछ कंपाइलर्स (उदाहरण के लिए [[जीएनयू कंपाइलर संग्रह]]) में, C++ इंस्टेंस विधियों के पॉइंटर्स को स्पष्ट रूप से किसी अन्य प्रकार के पॉइंटर पर सीधे डाला जा सकता है <code>this</code> सूचक पैरामीटर.<ref>Using the GNU Compiler Collection (GCC) &ndash; [https://gcc.gnu.org/onlinedocs/gcc/Bound-member-functions.html Bound member functions]</ref>
कुछ कंपाइलर्स (उदाहरण के लिए [[जीएनयू कंपाइलर संग्रह]]) में, C++ इंस्टेंस विधियों के पॉइंटर्स को स्पष्ट रूप से किसी अन्य प्रकार के पॉइंटर पर सीधे डाला जा सकता है <code>this</code> सूचक पैरामीटर.<ref>Using the GNU Compiler Collection (GCC) &ndash; [https://gcc.gnu.org/onlinedocs/gcc/Bound-member-functions.html Bound member functions]</ref>
===खुला प्रत्यावर्तन===
===खुला प्रत्यावर्तन===
का प्रेषण शब्दार्थ <code>this</code>, अर्थात् वह विधि चालू रहती है <code>this</code> गतिशील रूप से प्रेषित होते हैं, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका मतलब है कि ये विधियां व्युत्पन्न कक्षाओं या ऑब्जेक्ट्स द्वारा ओवरराइडिंग की जा सकती हैं। इसके विपरीत, किसी फ़ंक्शन का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन <code>__SUB__</code> वर्तमान फ़ंक्शन का संदर्भ है:
का प्रेषण शब्दार्थ <code>this</code>, अर्थात् वह विधि चालू रहती है <code>this</code> गतिशील रूप से प्रेषित होते हैं, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका कारणहै कि ये विधियां व्युत्पन्न कक्षाओं या ऑब्जेक्ट्स द्वारा ओवरराइडिंग की जा सकती हैं। इसके विपरीत, किसी फ़ंक्शन का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन <code>__SUB__</code> वर्तमान फ़ंक्शन का संदर्भ है:
<syntaxhighlight lang="perl">
<syntaxhighlight lang="perl">
use feature ":5.16";
use feature ":5.16";
Line 22: Line 22:
}
}
</syntaxhighlight>
</syntaxhighlight>
इसके विपरीत, C++ में (स्पष्ट का उपयोग करके <code>this</code> स्पष्टता के लिए, हालांकि आवश्यक नहीं) <code>this</code> ऑब्जेक्ट से ही जुड़ जाता है, लेकिन यदि क्लास विधि को आधार में वर्चुअल यानी बहुरूपी घोषित किया गया था, तो इसे डायनेमिक डिस्पैच (देर [[देर से बंधन]]) के माध्यम से हल किया जाता है ताकि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें।
इसके विपरीत, C++ में (स्पष्ट का उपयोग करके <code>this</code> स्पष्टता के लिए, चूंकि आवश्यक नहीं) <code>this</code> ऑब्जेक्ट से ही जुड़ जाता है, किन्तु यदि क्लास विधि को आधार में वर्चुअल अर्थात बहुरूपी घोषित किया गया था, तो इसे डायनेमिक डिस्पैच (देर [[देर से बंधन]]) के माध्यम से हल किया जाता है जिससे कि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें।
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
unsigned int factorial(unsigned int n)
unsigned int factorial(unsigned int n)
Line 32: Line 32:
}
}
</syntaxhighlight>
</syntaxhighlight>
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष प्रत्यावर्तन है, इसलिए ओवरराइडिंग है <code>factorial</code> विधि इस फ़ंक्शन को ओवरराइड कर देगी; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के मामलों में उसी विधि को कॉल करती है।<ref>"[http://www.cs.ox.ac.uk/people/ralf.hinze/talks/Open.pdf Closed and Open Recursion]", [http://www.informatik.uni-bonn.de/~ralf Ralf Hinze], July 2007</ref><ref>[http://lambda-the-ultimate.org/node/3204 Open Recursion], ''[http://lambda-the-ultimate.org/ Lambda the Ultimate]''</ref>
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष प्रत्यावर्तन है, इसलिए ओवरराइडिंग है <code>factorial</code> विधि इस फ़ंक्शन को ओवरराइड कर देगी; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के स्थितियोंमें उसी विधि को कॉल करती है।<ref>"[http://www.cs.ox.ac.uk/people/ralf.hinze/talks/Open.pdf Closed and Open Recursion]", [http://www.informatik.uni-bonn.de/~ralf Ralf Hinze], July 2007</ref><ref>[http://lambda-the-ultimate.org/node/3204 Open Recursion], ''[http://lambda-the-ultimate.org/ Lambda the Ultimate]''</ref>


कमजोर बेस क्लास समस्या के लिए ओपन रिकर्सन को दोषी ठहराया गया है, जिसमें सुझाव दिया गया है कि तरीकों को लागू किया जाए <code>this</code> खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के बजाय बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए डिफ़ॉल्ट, विशेष रूप से अनुरोध किए जाने पर केवल खुले रिकर्सन का उपयोग करना; बाहरी कॉल (उपयोग नहीं कर रहे हैं <code>this</code>) हमेशा की तरह गतिशील रूप से भेजा जाएगा।<ref>"[https://www.cs.cmu.edu/~aldrich/papers/selective-open-recursion.pdf Selective Open Recursion: A Solution to the Fragile Base Class Problem]", Jonathan Aldrich</ref><ref>"[http://lambda-the-ultimate.org/classic/message12271.html Selective Open Recursion: A Solution to the Fragile Base Class Problem]", ''[http://lambda-the-ultimate.org/ Lambda the Ultimate]''</ref> जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम शामिल हैं:<ref name="JDK">Aldrich, Jonathan, and Kevin Donnelly. "[https://www.cs.cmu.edu/~aldrich/papers/savcbs04.pdf Selective open recursion: Modular reasoning about components and inheritance.]" SAVCBS 2004 Specification and Verification of Component-Based Systems (2004): 26. citing for the JDK-adopted solution C. Ruby and G. T. Leavens. "Safely Creating Correct Subclasses without Seeing Superclass Code". In Object-Oriented Programming Systems, Languages, and Applications, October 2000. {{doi|10.1145/353171.353186}} also available as [http://www.eecs.ucf.edu/~leavens/tech-reports/ISU/TR00-05/TR.pdf technical report TR #00-05d]</ref>
कमजोर बेस क्लास समस्या के लिए ओपन रिकर्सन को दोषी ठहराया गया है, जिसमें सुझाव दिया गया है कि तरीकों को प्रयुक्त किया जाए <code>this</code> खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के अतिरिक्त बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए डिफ़ॉल्ट, विशेष रूप से अनुरोध किए जाने पर केवल खुले रिकर्सन का उपयोग करना; बाहरी कॉल (उपयोग नहीं कर रहे हैं <code>this</code>) हमेशा की तरह गतिशील रूप से भेजा जाएगा।<ref>"[https://www.cs.cmu.edu/~aldrich/papers/selective-open-recursion.pdf Selective Open Recursion: A Solution to the Fragile Base Class Problem]", Jonathan Aldrich</ref><ref>"[http://lambda-the-ultimate.org/classic/message12271.html Selective Open Recursion: A Solution to the Fragile Base Class Problem]", ''[http://lambda-the-ultimate.org/ Lambda the Ultimate]''</ref> जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम सम्मिलित हैं:<ref name="JDK">Aldrich, Jonathan, and Kevin Donnelly. "[https://www.cs.cmu.edu/~aldrich/papers/savcbs04.pdf Selective open recursion: Modular reasoning about components and inheritance.]" SAVCBS 2004 Specification and Verification of Component-Based Systems (2004): 26. citing for the JDK-adopted solution C. Ruby and G. T. Leavens. "Safely Creating Correct Subclasses without Seeing Superclass Code". In Object-Oriented Programming Systems, Languages, and Applications, October 2000. {{doi|10.1145/353171.353186}} also available as [http://www.eecs.ucf.edu/~leavens/tech-reports/ISU/TR00-05/TR.pdf technical report TR #00-05d]</ref>
* कोई कोड लागू नहीं होता <code>public</code> तरीकों पर <code>this</code>.
* कोई कोड प्रयुक्त नहीं होता <code>public</code> तरीकों पर <code>this</code>.
* कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) में समाहित किया गया है <code>protected</code> या <code>private</code> तरीका; यदि इसे सीधे उपयोगकर्ताओं के सामने प्रदर्शित करने की आवश्यकता है, तो आवरण <code>public</code> विधि आंतरिक विधि को कॉल करती है।
* कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) में समाहित किया गया है <code>protected</code> या <code>private</code> प्रणाली; यदि इसे सीधे उपयोगकर्ताओं के सामने प्रदर्शित करने की आवश्यकता है, तो आवरण <code>public</code> विधि आंतरिक विधि को कॉल करती है।
* [[शुद्ध कार्य]] विधियों के लिए पिछली अनुशंसा में ढील दी जा सकती है।
* [[शुद्ध कार्य]] विधियों के लिए पिछली अनुशंसा में ढील दी जा सकती है।


Line 44: Line 44:
{{details|सी++ कक्षाएं}}
{{details|सी++ कक्षाएं}}


C++ के शुरुआती संस्करण इसकी अनुमति देंगे <code>this</code> सूचक बदला जाए; ऐसा करने से प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। यह सुविधा अंततः हटा दी गई, और अब <code>this</code> C++ में वैल्यू (कंप्यूटर साइंस)#असाइनमेंट है: एल-वैल्यू और आर-वैल्यू|आर-वैल्यू।<ref name="C++03">{{cite book
C++ के प्रारंभिक संस्करण इसकी अनुमति देंगे <code>this</code> सूचक बदला जाए; ऐसा करने से प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। यह सुविधा अंततः हटा दी गई, और अब <code>this</code> C++ में वैल्यू (कंप्यूटर साइंस)#असाइनमेंट है: एल-वैल्यू और आर-वैल्यू|आर-वैल्यू।<ref name="C++03">{{cite book
| year = 2003
| year = 2003
| title = ISO/IEC 14882:2003(E): Programming Languages - C++
| title = ISO/IEC 14882:2003(E): Programming Languages - C++
Line 50: Line 50:
}}
}}
</ref>
</ref>
C++ के शुरुआती संस्करणों में संदर्भ शामिल नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, <code>this</code> संदर्भ होता, सूचक नहीं।<ref>Stroustrup: [http://www.stroustrup.com/bs_faq2.html#this C++ Style and Technique FAQ]</ref>
C++ के प्रारंभिक संस्करणों में संदर्भ सम्मिलित नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, <code>this</code> संदर्भ होता, सूचक नहीं।<ref>Stroustrup: [http://www.stroustrup.com/bs_faq2.html#this C++ Style and Technique FAQ]</ref>
 
C++ वस्तुओं को स्रोत कोड कथन के साथ स्वयं को नष्ट करने देता है: <code>delete this</code>.
C++ वस्तुओं को स्रोत कोड कथन के साथ स्वयं को नष्ट करने देता है: <code>delete this</code>.


=== सी ===
=== सी ===
{{details|सी शार्प (प्रोग्रामिंग भाषा)}}
{{details|सी शार्प (प्रोग्रामिंग भाषा)}}
कीवर्ड <code>this</code> सी शार्प (प्रोग्रामिंग भाषा) में|सी# संदर्भ प्रकारों के लिए जावा की तरह ही काम करता है। हालाँकि, C# [[मान प्रकार]]ों के भीतर, <code>this</code> सामान्य परिवर्तनीय चर संदर्भ के समान होने के कारण, इसमें काफी भिन्न शब्दार्थ हैं, और यह किसी असाइनमेंट के बाईं ओर भी हो सकता है।
कीवर्ड <code>this</code> सी शार्प (प्रोग्रामिंग भाषा) में|सी# संदर्भ प्रकारों के लिए जावा की तरह ही काम करता है। चूँकि, C# [[मान प्रकार]]ों के भीतर, <code>this</code> सामान्य परिवर्तनीय चर संदर्भ के समान होने के कारण, इसमें अधिक  भिन्न शब्दार्थ हैं, और यह किसी असाइनमेंट के बाईं ओर भी हो सकता है।


का प्रयोग <code>this</code> C# में विधि के भीतर बाहरी फ़ील्ड वैरिएबल के संदर्भ की अनुमति देना है जिसमें स्थानीय वैरिएबल होता है जिसका नाम समान होता है। ऐसी स्थिति में, उदाहरण के लिए, कथन <code>var n = localAndFieldname;</code> विधि के भीतर स्थानीय चर का प्रकार और मान निर्दिष्ट किया जाएगा <code>localAndFieldname</code> को <code>n</code>, जबकि कथन <code>var n = this.localAndFieldname;</code> बाहरी फ़ील्ड वैरिएबल का प्रकार और मान निर्दिष्ट करेगा <code>n</code>.<ref>De Smet, Bart, 2011. ''C# 4.0 Unleashed.'' Sams Publishing, Indianapolis, USA. Chapter 4, ''Language Essentials'', p 210. {{ISBN|978-0-672-33079-7}}</ref>
का प्रयोग <code>this</code> C# में विधि के भीतर बाहरी फ़ील्ड वैरिएबल के संदर्भ की अनुमति देना है जिसमें स्थानीय वैरिएबल होता है जिसका नाम समान होता है। ऐसी स्थिति में, उदाहरण के लिए, कथन <code>var n = localAndFieldname;</code> विधि के भीतर स्थानीय चर का प्रकार और मान निर्दिष्ट किया जाएगा <code>localAndFieldname</code> को <code>n</code>, जबकि कथन <code>var n = this.localAndFieldname;</code> बाहरी फ़ील्ड वैरिएबल का प्रकार और मान निर्दिष्ट करेगा <code>n</code>.<ref>De Smet, Bart, 2011. ''C# 4.0 Unleashed.'' Sams Publishing, Indianapolis, USA. Chapter 4, ''Language Essentials'', p 210. {{ISBN|978-0-672-33079-7}}</ref>
Line 107: Line 108:
</सिंटैक्सहाइलाइट>
</सिंटैक्सहाइलाइट>


कोई भी दृष्टिकोण संकलक को स्वीकार्य है, लेकिन निहित संस्करण (उदा. <code>x := foo</code>) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।
कोई भी दृष्टिकोण संकलक को स्वीकार्य है, किन्तु निहित संस्करण (उदा. <code>x := foo</code>) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।


अन्य भाषाओं की तरह, ऐसे समय भी आते हैं जब कीवर्ड का उपयोग किया जाता है <code>Current</code> अनिवार्य है, जैसे:
अन्य भाषाओं की तरह, ऐसे समय भी आते हैं जब कीवर्ड का उपयोग किया जाता है <code>Current</code> अनिवार्य है, जैसे:
Line 137: Line 138:
=== जावास्क्रिप्ट ===
=== जावास्क्रिप्ट ===
{{details|जावास्क्रिप्ट}}
{{details|जावास्क्रिप्ट}}
जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, <code>this</code> महत्वपूर्ण कीवर्ड है, हालाँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है।
जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, <code>this</code> महत्वपूर्ण कीवर्ड है, चूँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है।


* जब किसी फ़ंक्शन के बाहर, वैश्विक स्थान में उपयोग किया जाता है, <code>this</code> एन्क्लोजिंग ऑब्जेक्ट को संदर्भित करता है, जो इस मामले में एन्क्लोजिंग ब्राउज़र विंडो है <code>window</code> वस्तु।
* जब किसी फ़ंक्शन के बाहर, वैश्विक स्थान में उपयोग किया जाता है, <code>this</code> एन्क्लोजिंग ऑब्जेक्ट को संदर्भित करता है, जो इस मामले में एन्क्लोजिंग ब्राउज़र विंडो है <code>window</code> वस्तु।
* जब ग्लोबल स्पेस में परिभाषित किसी फ़ंक्शन में उपयोग किया जाता है, तो कीवर्ड क्या होता है <code>this</code> संदर्भित करता है यह इस पर निर्भर करता है कि फ़ंक्शन को कैसे कॉल किया जाता है। जब ऐसे फ़ंक्शन को सीधे कॉल किया जाता है (उदा. <code>f(x)</code>), <code>this</code> उस वैश्विक स्थान को संदर्भित करेगा जिसमें फ़ंक्शन परिभाषित किया गया है, और जिसमें अन्य वैश्विक फ़ंक्शन और चर भी मौजूद हो सकते हैं (या सख्त मोड में, यह है <code>undefined</code>). यदि वैश्विक फ़ंक्शन युक्त है <code>this</code> हालाँकि, दस्तावेज़ ऑब्जेक्ट में किसी तत्व के ईवेंट हैंडलर के भाग के रूप में कॉल किया जाता है <code>this</code> कॉलिंग HTML तत्व को संदर्भित करेगा।
* जब ग्लोबल स्पेस में परिभाषित किसी फ़ंक्शन में उपयोग किया जाता है, तो कीवर्ड क्या होता है <code>this</code> संदर्भित करता है यह इस पर निर्भर करता है कि फ़ंक्शन को कैसे कॉल किया जाता है। जब ऐसे फ़ंक्शन को सीधे कॉल किया जाता है (उदा. <code>f(x)</code>), <code>this</code> उस वैश्विक स्थान को संदर्भित करेगा जिसमें फ़ंक्शन परिभाषित किया गया है, और जिसमें अन्य वैश्विक फ़ंक्शन और चर भी उपस्तिथ हो सकते हैं (या सख्त मोड में, यह है <code>undefined</code>). यदि वैश्विक फ़ंक्शन युक्त है <code>this</code> चूँकि, दस्तावेज़ ऑब्जेक्ट में किसी तत्व के ईवेंट हैंडलर के भाग के रूप में कॉल किया जाता है <code>this</code> कॉलिंग HTML तत्व को संदर्भित करेगा।
* जब किसी विधि का उपयोग करके कॉल किया जाता है <code>new</code> कीवर्ड (उदा. <code>var c = new Thing()</code>) फिर थिंग के भीतर  <code>this</code> थिंग ऑब्जेक्ट को ही संदर्भित करता है।
* जब किसी विधि का उपयोग करके कॉल किया जाता है <code>new</code> कीवर्ड (उदा. <code>var c = new Thing()</code>) फिर थिंग के भीतर  <code>this</code> थिंग ऑब्जेक्ट को ही संदर्भित करता है।
* जब किसी फ़ंक्शन को किसी ऑब्जेक्ट की प्रॉपर्टी के रूप में जोड़ा जाता है और उस ऑब्जेक्ट की विधि के रूप में बुलाया जाता है (उदाहरण के लिए) <code>obj.f(x)</code>), <code>this</code> उस ऑब्जेक्ट को संदर्भित करेगा जिसके भीतर फ़ंक्शन निहित है।<ref>Crockford, Douglas, 2008. ''JavaScript: The Good Parts''. O'Reilly Media Inc. and Yahoo! Inc. Chapter 4, ''Functions'', p 28. {{ISBN|978-0-596-51774-8}}</ref><ref>Powell, Thomas A, and Schneider, Fritz, 2012. ''JavaScript: The Complete Reference, Third Edition.'' McGraw-Hill. Chapter 5, ''Functions'', pp 170&ndash;1. {{ISBN|978-0-07-174120-0}}</ref> इसे मैन्युअल रूप से निर्दिष्ट करना भी संभव है <code>this</code> किसी फ़ंक्शन को कॉल करते समय, का उपयोग करके <code>.call()</code> या <code>.apply()</code> फ़ंक्शन ऑब्जेक्ट के तरीके।<ref>Goodman, Danny, with Morrison, Michael, 2004. ''JavaScript Bible, 5th Edition.'' Wiley Publishing, Inc., Indianapolis, USA. Chapter 33, ''Functions and Custom Objects'', p 987. {{ISBN|0-7645-5743-2}}</ref> उदाहरण के लिए, विधि कॉल <code>obj.f(x)</code> के रूप में भी लिखा जा सकता है <code>obj.f.call(obj, x)</code>.
* जब किसी फ़ंक्शन को किसी ऑब्जेक्ट की प्रॉपर्टी के रूप में जोड़ा जाता है और उस ऑब्जेक्ट की विधि के रूप में बुलाया जाता है (उदाहरण के लिए) <code>obj.f(x)</code>), <code>this</code> उस ऑब्जेक्ट को संदर्भित करेगा जिसके भीतर फ़ंक्शन निहित है।<ref>Crockford, Douglas, 2008. ''JavaScript: The Good Parts''. O'Reilly Media Inc. and Yahoo! Inc. Chapter 4, ''Functions'', p 28. {{ISBN|978-0-596-51774-8}}</ref><ref>Powell, Thomas A, and Schneider, Fritz, 2012. ''JavaScript: The Complete Reference, Third Edition.'' McGraw-Hill. Chapter 5, ''Functions'', pp 170&ndash;1. {{ISBN|978-0-07-174120-0}}</ref> इसे मैन्युअल रूप से निर्दिष्ट करना भी संभव है <code>this</code> किसी फ़ंक्शन को कॉल करते समय, का उपयोग करके <code>.call()</code> या <code>.apply()</code> फ़ंक्शन ऑब्जेक्ट के तरीके।<ref>Goodman, Danny, with Morrison, Michael, 2004. ''JavaScript Bible, 5th Edition.'' Wiley Publishing, Inc., Indianapolis, USA. Chapter 33, ''Functions and Custom Objects'', p 987. {{ISBN|0-7645-5743-2}}</ref> उदाहरण के लिए, विधि कॉल <code>obj.f(x)</code> के रूप में भी लिखा जा सकता है <code>obj.f.call(obj, x)</code>.


के विभिन्न अर्थों के इर्द-गिर्द काम करना <code>this</code> DOM ईवेंट हैंडलर जैसे नेस्टेड फ़ंक्शंस में, इसे सहेजना जावास्क्रिप्ट में सामान्य मुहावरा है <code>this</code> वेरिएबल में कॉलिंग ऑब्जेक्ट का संदर्भ (आमतौर पर कहा जाता है <code>that</code> या <code>self</code>), और फिर नेस्टेड फ़ंक्शंस में कॉलिंग ऑब्जेक्ट को संदर्भित करने के लिए वेरिएबल का उपयोग करें।
के विभिन्न अर्थों के इर्द-गिर्द काम करना <code>this</code> DOM ईवेंट हैंडलर जैसे नेस्टेड फ़ंक्शंस में, इसे सहेजना जावास्क्रिप्ट में सामान्य मुहावरा है <code>this</code> वेरिएबल में कॉलिंग ऑब्जेक्ट का संदर्भ (सामान्यतः कहा जाता है <code>that</code> या <code>self</code>), और फिर नेस्टेड फ़ंक्शंस में कॉलिंग ऑब्जेक्ट को संदर्भित करने के लिए वेरिएबल का उपयोग करें।


उदाहरण के लिए:
उदाहरण के लिए:
Line 165: Line 166:
=== दो ===
=== दो ===
{{details|लुआ (प्रोग्रामिंग भाषा)}}
{{details|लुआ (प्रोग्रामिंग भाषा)}}
लुआ में, <code>self</code> जब फ़ंक्शंस का उपयोग करके परिभाषित किया जाता है तो सिंटैक्टिक शुगर के रूप में बनाया जाता है <code>:</code> ऑपरेटर।<ref>{{Cite web|url=https://www.lua.org/pil/16.html|title = Programming in Lua : 16}}</ref> किसी विधि का उपयोग करते समय <code>:</code>, अनुक्रमित की जा रही वस्तु को अंतर्निहित रूप से लागू किए जा रहे फ़ंक्शन के पहले तर्क के रूप में दिया जाएगा।
लुआ में, <code>self</code> जब फ़ंक्शंस का उपयोग करके परिभाषित किया जाता है तो सिंटैक्टिक शुगर के रूप में बनाया जाता है <code>:</code> ऑपरेटर।<ref>{{Cite web|url=https://www.lua.org/pil/16.html|title = Programming in Lua : 16}}</ref> किसी विधि का उपयोग करते समय <code>:</code>, अनुक्रमित की जा रही वस्तु को अंतर्निहित रूप से प्रयुक्त किए जा रहे फ़ंक्शन के पहले तर्क के रूप में दिया जाएगा।


उदाहरण के लिए, निम्नलिखित दो कार्य समतुल्य हैं:
उदाहरण के लिए, निम्नलिखित दो कार्य समतुल्य हैं:
Line 185: Line 186:
obj.bar(obj, "Bar") -- equivalent to obj:bar("Bar")
obj.bar(obj, "Bar") -- equivalent to obj:bar("Bar")
</syntaxhighlight>
</syntaxhighlight>
लुआ स्वयं ऑब्जेक्ट-ओरिएंटेड नहीं है, लेकिन जब इसे मेटाटेबल्स नामक अन्य सुविधा के साथ जोड़ा जाता है, तो इसका उपयोग किया जाता है <code>self</code> प्रोग्रामर को फ़ंक्शन को ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के समान तरीके से परिभाषित करने देता है।
लुआ स्वयं ऑब्जेक्ट-ओरिएंटेड नहीं है, किन्तु जब इसे मेटाटेबल्स नामक अन्य सुविधा के साथ जोड़ा जाता है, तो इसका उपयोग किया जाता है <code>self</code> प्रोग्रामर को फ़ंक्शन को ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के समान तरीके से परिभाषित करने देता है।


=== पावरशेल ===
=== पावरशेल ===
PowerShell में विशेष [[स्वचालित चर]] <code>$_</code> पाइपलाइन ऑब्जेक्ट में वर्तमान ऑब्जेक्ट शामिल है। आप इस वेरिएबल का उपयोग उन कमांड्स में कर सकते हैं जो प्रत्येक ऑब्जेक्ट पर या पाइपलाइन में चयनित ऑब्जेक्ट पर कार्रवाई करते हैं।<ref>{{Cite web|url=https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables|title=PowerShell: About Automatic Variables|last=msdn|website=docs.microsoft.com|language=en-us|access-date=2018-03-22}}</ref>
PowerShell में विशेष [[स्वचालित चर]] <code>$_</code> पाइपलाइन ऑब्जेक्ट में वर्तमान ऑब्जेक्ट सम्मिलित है। आप इस वेरिएबल का उपयोग उन कमांड्स में कर सकते हैं जो प्रत्येक ऑब्जेक्ट पर या पाइपलाइन में चयनित ऑब्जेक्ट पर कार्रवाई करते हैं।<ref>{{Cite web|url=https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables|title=PowerShell: About Automatic Variables|last=msdn|website=docs.microsoft.com|language=en-us|access-date=2018-03-22}}</ref>
<सिंटैक्सहाइलाइट लैंग=पीएस1 >
<सिंटैक्सहाइलाइट लैंग=पीएस1 >
  एक , दो , तीन | % { $_ लिखें }
  एक , दो , तीन | % { $_ लिखें }
</सिंटैक्सहाइलाइट>पॉवरशेल 5.0 से भी शुरू होता है, जो कक्षाओं और अन्य उपयोगकर्ता-परिभाषित प्रकारों को परिभाषित करने के लिए औपचारिक वाक्यविन्यास जोड़ता है,<ref>{{Cite web|url=https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes|title=about_Classes|last=msdn|website=docs.microsoft.com|language=en-us|access-date=2018-12-17}}</ref> <code>$this</code> वेरिएबल ऑब्जेक्ट के वर्तमान उदाहरण का वर्णन करता है।
</सिंटैक्सहाइलाइट>पॉवरशेल 5.0 से भी प्रारंभ होता है, जो कक्षाओं और अन्य उपयोगकर्ता-परिभाषित प्रकारों को परिभाषित करने के लिए औपचारिक वाक्यविन्यास जोड़ता है,<ref>{{Cite web|url=https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes|title=about_Classes|last=msdn|website=docs.microsoft.com|language=en-us|access-date=2018-12-17}}</ref> <code>$this</code> वेरिएबल ऑब्जेक्ट के वर्तमान उदाहरण का वर्णन करता है।


===पायथन ===
===पायथन ===
पायथन में, के लिए कोई कीवर्ड नहीं है <code>this</code>. जब किसी सदस्य फ़ंक्शन को किसी ऑब्जेक्ट पर कॉल किया जाता है, तो यह ऑब्जेक्ट के क्लास ऑब्जेक्ट पर उसी नाम के साथ सदस्य फ़ंक्शन को आमंत्रित करता है, ऑब्जेक्ट स्वचालित रूप से फ़ंक्शन के पहले तर्क से जुड़ा होता है। इस प्रकार, विधि (कंप्यूटर प्रोग्रामिंग) का अनिवार्य पहला पैरामीटर के रूप में कार्य करता है <code>this</code>; इस पैरामीटर को पारंपरिक रूप से नाम दिया गया है <code>self</code>, लेकिन नाम कुछ भी रखा जा सकता है।
पायथन में, के लिए कोई कीवर्ड नहीं है <code>this</code>. जब किसी सदस्य फ़ंक्शन को किसी ऑब्जेक्ट पर कॉल किया जाता है, तो यह ऑब्जेक्ट के क्लास ऑब्जेक्ट पर उसी नाम के साथ सदस्य फ़ंक्शन को आमंत्रित करता है, ऑब्जेक्ट स्वचालित रूप से फ़ंक्शन के पहले तर्क से जुड़ा होता है। इस प्रकार, विधि (कंप्यूटर प्रोग्रामिंग) का अनिवार्य पहला पैरामीटर के रूप में कार्य करता है <code>this</code>; इस पैरामीटर को पारंपरिक रूप से नाम दिया गया है <code>self</code>, किन्तु नाम कुछ भी रखा जा सकता है।


कक्षा विधियों में (के साथ बनाया गया <code>classmethod</code> डेकोरेटर), पहला तर्क क्लास ऑब्जेक्ट को ही संदर्भित करता है, और इसे पारंपरिक रूप से कहा जाता है <code>cls</code>; इनका उपयोग मुख्य रूप से इनहेरिटेबल कंस्ट्रक्टर्स के लिए किया जाता है,<ref>''Unifying types and classes in Python 2.2,'' Guido van Rossum, "[https://www.python.org/download/releases/2.2.3/descrintro/#__new__ Overriding the __new__ method]"</ref> जहां पैरामीटर के रूप में क्लास का उपयोग कंस्ट्रक्टर को उपवर्गीकृत करने की अनुमति देता है। स्थैतिक तरीकों में (के साथ बनाया गया <code>staticmethod</code> डेकोरेटर), कोई विशेष पहला तर्क मौजूद नहीं है।
कक्षा विधियों में (के साथ बनाया गया <code>classmethod</code> डेकोरेटर), पहला तर्क क्लास ऑब्जेक्ट को ही संदर्भित करता है, और इसे पारंपरिक रूप से कहा जाता है <code>cls</code>; इनका उपयोग मुख्य रूप से इनहेरिटेबल कंस्ट्रक्टर्स के लिए किया जाता है,<ref>''Unifying types and classes in Python 2.2,'' Guido van Rossum, "[https://www.python.org/download/releases/2.2.3/descrintro/#__new__ Overriding the __new__ method]"</ref> जहां पैरामीटर के रूप में क्लास का उपयोग कंस्ट्रक्टर को उपवर्गीकृत करने की अनुमति देता है। स्थैतिक तरीकों में (के साथ बनाया गया <code>staticmethod</code> डेकोरेटर), कोई विशेष पहला तर्क उपस्तिथ नहीं है।


===जंग ===
===जंग ===
Line 238: Line 239:
<code>Self</code> किसी वर्ग के तरीकों के भीतर सख्ती से उपयोग किया जाता है।
<code>Self</code> किसी वर्ग के तरीकों के भीतर सख्ती से उपयोग किया जाता है।


संदर्भित करने का दूसरा तरीका <code>Self</code> उपयोग करना है <code>::</code>.
संदर्भित करने का दूसरा प्रणाली <code>Self</code> उपयोग करना है <code>::</code>.


== यह भी देखें ==
== यह भी देखें ==
Line 250: Line 251:
{{Reflist|30em}}
{{Reflist|30em}}
==अग्रिम पठन==
==अग्रिम पठन==
* मेयर्स, स्कॉट, 1995। अधिक प्रभावी सी++: आपके प्रोग्राम और डिज़ाइन को बेहतर बनाने के 35 नए तरीके। {{ISBN|0-201-63371-X}} [[Scott Meyers|स्कॉट मेयर्स]]
* मेयर्स, स्कॉट, 1995। अधिक प्रभावी सी++: आपके प्रोग्राम और डिज़ाइन को उत्तम बनाने के 35 नए तरीके। {{ISBN|0-201-63371-X}} [[Scott Meyers|स्कॉट मेयर्स]]
* स्ट्रॉस्ट्रुप, बर्जने, 1994। सी++ का डिज़ाइन और विकास। एडिसन-वेस्ले पब। कं {{ISBN|0-201-54330-3}} [[Bjarne Stroustrup|बज़्ने स्ट्रॉस्ट्रुप]]
* स्ट्रॉस्ट्रुप, बर्जने, 1994। सी++ का डिज़ाइन और विकास। एडिसन-वेस्ले पब। कं {{ISBN|0-201-54330-3}} [[Bjarne Stroustrup|बज़्ने स्ट्रॉस्ट्रुप]]
{{DEFAULTSORT:This (Computer Programming)}}[[Category: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]  
{{DEFAULTSORT:This (Computer Programming)}}[[Category: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]  

Revision as of 22:31, 2 August 2023

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

वस्तु-उन्मुख प्रोग्रामिंग

कई ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, this (यह भी कहा जाता है self या Me) वेरिएबल है जिसका उपयोग इंस्टेंस विधियों में उस ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है जिस पर वे काम कर रहे हैं। पहली OO भाषा, शुरुआत , का उपयोग किया गया this स्थानीय वस्तु को स्पष्ट रूप से संदर्भित करने के लिए।[1]: 4.3.2.3  C++ और इससे शैली में व्युत्पन्न भाषाएं (जैसे जावा (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा)|सी#, डी (प्रोग्रामिंग भाषा), और पीएचपी) भी सामान्यतः उपयोग की जाती हैं this. स्मॉलटॉक और अन्य, जैसे ऑब्जेक्ट पास्कल, पर्ल, पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा), रस्ट (प्रोग्रामिंग भाषा), उद्देश्य सी , डेटाफ्लेक्स और स्विफ्ट (प्रोग्रामिंग भाषा), उपयोग करें self. माइक्रोसॉफ्ट के मूल दृश्य का उपयोग करता है Me.

यह अवधारणा सभी भाषाओं में समान है: this सामान्यतः अपरिवर्तनीय संदर्भ (कंप्यूटर विज्ञान) या सूचक (कंप्यूटर प्रोग्रामिंग) है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अधिकांशतः वह कोड होता है जो संपत्ति (प्रोग्रामिंग) , विधि (कंप्यूटर प्रोग्रामिंग) , सब-रूटीन या फ़ंक्शन के लिए 'पैरेंट' या 'इनवॉकेंट' के रूप में कार्य करता है जिसमें सम्मिलित होता है this कीवर्ड. किसी वस्तु के ठीक से निर्माण या त्वरितीकरण के बाद, this हमेशा वैध संदर्भ होता है. कुछ भाषाओं को स्पष्ट रूप से इसकी आवश्यकता होती है; अन्य लोग अपने वर्ग के प्रतीकों को दृश्यमान बनाने के लिए इसका अंतर्निहित रूप से उपयोग करने के लिए शाब्दिक दायरा का उपयोग करते हैं। या वैकल्पिक रूप से, वर्तमान वस्तु द्वारा संदर्भित this स्वतंत्र कोड ऑब्जेक्ट हो सकता है जिसने कीवर्ड वाले फ़ंक्शन या विधि को कॉल किया हो this. ऐसी बात होती है, उदाहरण के लिए, जब किसी वेब पेज में HTML टैग से जुड़ा जावास्क्रिप्ट ईवेंट हैंडलर कीवर्ड वाले फ़ंक्शन को कॉल करता है this दस्तावेज़ ऑब्जेक्ट के बाहर वैश्विक स्थान में संग्रहीत; उस संदर्भ में, this दस्तावेज़ ऑब्जेक्ट के भीतर पृष्ठ तत्व को संदर्भित करेगा, संलग्न विंडो ऑब्जेक्ट को नहीं।[2] कुछ भाषाओं में, उदाहरण के लिए C++, Java और Raku this या self कीवर्ड (कंप्यूटर प्रोग्रामिंग) है, और वेरिएबल स्वचालित रूप से इंस्टेंस विधियों में उपस्तिथ होता है। दूसरों में, उदाहरण के लिए पायथन, रस्ट और पर्ल 5 में, इंस्टेंस विधि का पहला पैरामीटर ऐसा संदर्भ है। इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। पायथन और पर्ल में, पैरामीटर को आवश्यक रूप से नाम देने की आवश्यकता नहीं है this या self; इसे किसी अन्य पैरामीटर की तरह प्रोग्रामर द्वारा स्वतंत्र रूप से नामित किया जा सकता है। चूँकि, अनौपचारिक परंपरा के अनुसार, पर्ल या पायथन में इंस्टेंस विधि के पहले पैरामीटर का नाम दिया जाता है self. जंग के लिए स्वयं वस्तु को बुलाए जाने की आवश्यकता होती है &self या self, इस पर निर्भर करता है कि क्या आह्वान किया गया फ़ंक्शन आह्वानकर्ता को उधार लेता है, या उसे क्रमशः अंदर ले जाता है।

C++ या Java में स्टेटिक विधियाँ उदाहरणों से नहीं किंतु कक्षाओं से संबद्ध हैं, और इसलिए उनका उपयोग नहीं किया जा सकता है this, क्योंकि कोई वस्तु नहीं है। अन्य भाषाओं में, जैसे रूबी, स्मॉलटॉक, ऑब्जेक्टिव-सी, या स्विफ्ट, विधि क्लास ऑब्जेक्ट से जुड़ी होती है जिसे इस प्रकार पारित किया जाता है this, और उन्हें क्लास विधियाँ कहा जाता है। क्लास विधियों के लिए, पायथन का उपयोग किया जाता है cls क्लास ऑब्जेक्ट तक पहुंचने के लिए।

बारीकियाँ और कठिनाइयाँ

जब अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है this, का उपयोग this कोड में, चूंकि यह अवैध नहीं है, यह रखरखाव प्रोग्रामर के लिए चेतावनी की घंटी बजा सकता है, चूंकि इसके अभी भी वैध उपयोग हैं this इस मामले में, जैसे कि ही नाम के स्थानीय चर द्वारा छिपे हुए उदाहरण चर का संदर्भ देना, या यदि विधि वर्तमान ऑब्जेक्ट का संदर्भ वापस करना चाहती है, अर्थात। this, अपने आप।

कुछ कंपाइलर्स (उदाहरण के लिए जीएनयू कंपाइलर संग्रह) में, C++ इंस्टेंस विधियों के पॉइंटर्स को स्पष्ट रूप से किसी अन्य प्रकार के पॉइंटर पर सीधे डाला जा सकता है this सूचक पैरामीटर.[3]

खुला प्रत्यावर्तन

का प्रेषण शब्दार्थ this, अर्थात् वह विधि चालू रहती है this गतिशील रूप से प्रेषित होते हैं, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका कारणहै कि ये विधियां व्युत्पन्न कक्षाओं या ऑब्जेक्ट्स द्वारा ओवरराइडिंग की जा सकती हैं। इसके विपरीत, किसी फ़ंक्शन का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन __SUB__ वर्तमान फ़ंक्शन का संदर्भ है:

use feature ":5.16";
sub {
    my $x = shift;
    $x == 0 ? 1 : $x * __SUB__->( $x - 1 );
}

इसके विपरीत, C++ में (स्पष्ट का उपयोग करके this स्पष्टता के लिए, चूंकि आवश्यक नहीं) this ऑब्जेक्ट से ही जुड़ जाता है, किन्तु यदि क्लास विधि को आधार में वर्चुअल अर्थात बहुरूपी घोषित किया गया था, तो इसे डायनेमिक डिस्पैच (देर देर से बंधन) के माध्यम से हल किया जाता है जिससे कि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें।

unsigned int factorial(unsigned int n)
{
  if (n == 0)
    return 1;
  else
    return n * this->factorial(n - 1);
}

यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष प्रत्यावर्तन है, इसलिए ओवरराइडिंग है factorial विधि इस फ़ंक्शन को ओवरराइड कर देगी; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के स्थितियोंमें उसी विधि को कॉल करती है।[4][5]

कमजोर बेस क्लास समस्या के लिए ओपन रिकर्सन को दोषी ठहराया गया है, जिसमें सुझाव दिया गया है कि तरीकों को प्रयुक्त किया जाए this खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के अतिरिक्त बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए डिफ़ॉल्ट, विशेष रूप से अनुरोध किए जाने पर केवल खुले रिकर्सन का उपयोग करना; बाहरी कॉल (उपयोग नहीं कर रहे हैं this) हमेशा की तरह गतिशील रूप से भेजा जाएगा।[6][7] जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम सम्मिलित हैं:[8]

  • कोई कोड प्रयुक्त नहीं होता public तरीकों पर this.
  • कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) में समाहित किया गया है protected या private प्रणाली; यदि इसे सीधे उपयोगकर्ताओं के सामने प्रदर्शित करने की आवश्यकता है, तो आवरण public विधि आंतरिक विधि को कॉल करती है।
  • शुद्ध कार्य विधियों के लिए पिछली अनुशंसा में ढील दी जा सकती है।

कार्यान्वयन

सी++

C++ के प्रारंभिक संस्करण इसकी अनुमति देंगे this सूचक बदला जाए; ऐसा करने से प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। यह सुविधा अंततः हटा दी गई, और अब this C++ में वैल्यू (कंप्यूटर साइंस)#असाइनमेंट है: एल-वैल्यू और आर-वैल्यू|आर-वैल्यू।[9] C++ के प्रारंभिक संस्करणों में संदर्भ सम्मिलित नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, this संदर्भ होता, सूचक नहीं।[10]

C++ वस्तुओं को स्रोत कोड कथन के साथ स्वयं को नष्ट करने देता है: delete this.

सी

कीवर्ड this सी शार्प (प्रोग्रामिंग भाषा) में|सी# संदर्भ प्रकारों के लिए जावा की तरह ही काम करता है। चूँकि, C# मान प्रकारों के भीतर, this सामान्य परिवर्तनीय चर संदर्भ के समान होने के कारण, इसमें अधिक भिन्न शब्दार्थ हैं, और यह किसी असाइनमेंट के बाईं ओर भी हो सकता है।

का प्रयोग this C# में विधि के भीतर बाहरी फ़ील्ड वैरिएबल के संदर्भ की अनुमति देना है जिसमें स्थानीय वैरिएबल होता है जिसका नाम समान होता है। ऐसी स्थिति में, उदाहरण के लिए, कथन var n = localAndFieldname; विधि के भीतर स्थानीय चर का प्रकार और मान निर्दिष्ट किया जाएगा localAndFieldname को n, जबकि कथन var n = this.localAndFieldname; बाहरी फ़ील्ड वैरिएबल का प्रकार और मान निर्दिष्ट करेगा n.[11]

डी

डी में (प्रोग्रामिंग भाषा) this किसी वर्ग, संरचना या संघ विधि में संलग्न समुच्चय के उदाहरण के अपरिवर्तनीय संदर्भ को संदर्भित किया जाता है। कक्षाएं संदर्भ प्रकार के प्रकार हैं, संरचनाएं और यूनियन मूल्य प्रकार हैं। डी के पहले संस्करण में, कीवर्ड this उस ऑब्जेक्ट के उदाहरण के लिए सूचक के रूप में उपयोग किया जाता है जिससे विधि जुड़ी हुई है, जबकि डी 2 में इसमें संदर्भ द्वारा अंतर्निहित कॉल का चरित्र होता है |refफ़ंक्शन तर्क.

डायलन

प्रोग्रामिंग भाषा में डायलन (प्रोग्रामिंग भाषा), जो ऑब्जेक्ट-ओरिएंटेड भाषा है जो बहुपद्धति का समर्थन करती है और इसकी अवधारणा नहीं है this, किसी ऑब्जेक्ट को संदेश भेजना अभी भी सिंटैक्स में रखा जाता है। नीचे दिए गए दोनों फॉर्म ही तरह से काम करते हैं; अंतर केवल वाक्यात्मक शर्करा है।

ऑब्जेक्ट.विधि(परम1, परम2)

और

विधि (ऑब्जेक्ट, परम1, परम2)

एफिल

एक वर्ग पाठ के भीतर, वर्तमान प्रकार वर्तमान वर्ग से प्राप्त प्रकार है। किसी कक्षा की सुविधाओं (दिनचर्या, आदेश और प्रश्न) के भीतर, कोई कीवर्ड का उपयोग कर सकता है Current वर्तमान वर्ग और उसकी विशेषताओं का संदर्भ देने के लिए। कीवर्ड का उपयोग Current कीवर्ड के रूप में वैकल्पिक है Current इसका तात्पर्य केवल वर्तमान वर्ग सुविधा के नाम को खुले तौर पर संदर्भित करना है। उदाहरण के लिए: किसी के पास क्लास MY_CLASS में `फू' सुविधा हो सकती है और इसे इसके द्वारा संदर्भित किया जा सकता है:

<सिंटैक्सहाइलाइट लैंग= एफिल लाइन हाइलाइट= 10 >

 कक्षा
    मेरी कक्षा
 
 सुविधा--पहुँच
 
    foo: पूर्णांक
 
    मेरा_फ़ंक्शन: पूर्णांक
       करना
         परिणाम:= फू
      अंत

अंत

</सिंटैक्सहाइलाइट>[12] पंक्ति #10 (ऊपर) का निहित संदर्भ है Current सरल `फू' पर कॉल करके।

पंक्ति #10 (नीचे) का स्पष्ट संदर्भ है Current `Current.foo' पर कॉल द्वारा।

<सिंटैक्सहाइलाइट लैंग= एफिल लाइन हाइलाइट= 10 >

 कक्षा
    मेरी कक्षा
 
 सुविधा--पहुँच
 
    foo: पूर्णांक
 
    मेरा_फ़ंक्शन: पूर्णांक
       करना
          परिणाम:=वर्तमान.फू
      अंत

अंत

</सिंटैक्सहाइलाइट>

कोई भी दृष्टिकोण संकलक को स्वीकार्य है, किन्तु निहित संस्करण (उदा. x := foo) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।

अन्य भाषाओं की तरह, ऐसे समय भी आते हैं जब कीवर्ड का उपयोग किया जाता है Current अनिवार्य है, जैसे:

<सिंटैक्सहाइलाइट लैंग= एफिल लाइन हाइलाइट= 11 >

 कक्षा
    मेरी कक्षा
 
 सुविधा--पहुँच
 
    my_command
          -- 'वर्तमान' के साथ MY_OTHER_CLASS बनाएं
       स्थानीय
          एक्स: मेरी_अन्य_क्लास
      करना
         x.make_with_something बनाएं (वर्तमान)
      अंत

अंत

</सिंटैक्सहाइलाइट>

उपरोक्त कोड के मामले में, लाइन #11 पर make_with_something पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है Current.

जावा

कीवर्ड this जावा (प्रोग्रामिंग भाषा) भाषा कीवर्ड है जो उस वर्ग के वर्तमान उदाहरण का प्रतिनिधित्व करता है जिसमें यह दिखाई देता है। इसका उपयोग क्लास वेरिएबल्स और विधियों तक पहुंचने के लिए किया जाता है।

चूँकि जावा में सभी इंस्टेंस विधियाँ आभासी हैं, this कभी भी शून्य नहीं हो सकता.[13]

जावास्क्रिप्ट

जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, this महत्वपूर्ण कीवर्ड है, चूँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है।

  • जब किसी फ़ंक्शन के बाहर, वैश्विक स्थान में उपयोग किया जाता है, this एन्क्लोजिंग ऑब्जेक्ट को संदर्भित करता है, जो इस मामले में एन्क्लोजिंग ब्राउज़र विंडो है window वस्तु।
  • जब ग्लोबल स्पेस में परिभाषित किसी फ़ंक्शन में उपयोग किया जाता है, तो कीवर्ड क्या होता है this संदर्भित करता है यह इस पर निर्भर करता है कि फ़ंक्शन को कैसे कॉल किया जाता है। जब ऐसे फ़ंक्शन को सीधे कॉल किया जाता है (उदा. f(x)), this उस वैश्विक स्थान को संदर्भित करेगा जिसमें फ़ंक्शन परिभाषित किया गया है, और जिसमें अन्य वैश्विक फ़ंक्शन और चर भी उपस्तिथ हो सकते हैं (या सख्त मोड में, यह है undefined). यदि वैश्विक फ़ंक्शन युक्त है this चूँकि, दस्तावेज़ ऑब्जेक्ट में किसी तत्व के ईवेंट हैंडलर के भाग के रूप में कॉल किया जाता है this कॉलिंग HTML तत्व को संदर्भित करेगा।
  • जब किसी विधि का उपयोग करके कॉल किया जाता है new कीवर्ड (उदा. var c = new Thing()) फिर थिंग के भीतर this थिंग ऑब्जेक्ट को ही संदर्भित करता है।
  • जब किसी फ़ंक्शन को किसी ऑब्जेक्ट की प्रॉपर्टी के रूप में जोड़ा जाता है और उस ऑब्जेक्ट की विधि के रूप में बुलाया जाता है (उदाहरण के लिए) obj.f(x)), this उस ऑब्जेक्ट को संदर्भित करेगा जिसके भीतर फ़ंक्शन निहित है।[14][15] इसे मैन्युअल रूप से निर्दिष्ट करना भी संभव है this किसी फ़ंक्शन को कॉल करते समय, का उपयोग करके .call() या .apply() फ़ंक्शन ऑब्जेक्ट के तरीके।[16] उदाहरण के लिए, विधि कॉल obj.f(x) के रूप में भी लिखा जा सकता है obj.f.call(obj, x).

के विभिन्न अर्थों के इर्द-गिर्द काम करना this DOM ईवेंट हैंडलर जैसे नेस्टेड फ़ंक्शंस में, इसे सहेजना जावास्क्रिप्ट में सामान्य मुहावरा है this वेरिएबल में कॉलिंग ऑब्जेक्ट का संदर्भ (सामान्यतः कहा जाता है that या self), और फिर नेस्टेड फ़ंक्शंस में कॉलिंग ऑब्जेक्ट को संदर्भित करने के लिए वेरिएबल का उपयोग करें।

उदाहरण के लिए:

// In this example $ is a reference to the jQuery library 
$(".element").hover(function() {
    // Here, both this and that point to the element under the mouse cursor.
    var that = this;
    
    $(this).find('.elements').each(function() {
        // Here, this points to the DOM element being iterated.
        // However, that still points to the element under the mouse cursor.
        $(this).addClass("highlight");
    });
});

विशेष रूप से, जावास्क्रिप्ट दोनों का उपयोग करता है this और संबंधित कीवर्ड self[17] (अधिकांश अन्य भाषाओं के विपरीत जो या दूसरे को नियोजित करती हैं), साथ self विशेष रूप से वेब कर्मियों तक ही सीमित रखा जा रहा है।[18] अंत में, वैश्विक (विंडो या समतुल्य) ऑब्जेक्ट को विशेष रूप से संदर्भित करने के विश्वसनीय तरीके के रूप में, जावास्क्रिप्ट की सुविधा है globalThis कीवर्ड.[19]

दो

लुआ में, self जब फ़ंक्शंस का उपयोग करके परिभाषित किया जाता है तो सिंटैक्टिक शुगर के रूप में बनाया जाता है : ऑपरेटर।[20] किसी विधि का उपयोग करते समय :, अनुक्रमित की जा रही वस्तु को अंतर्निहित रूप से प्रयुक्त किए जा रहे फ़ंक्शन के पहले तर्क के रूप में दिया जाएगा।

उदाहरण के लिए, निम्नलिखित दो कार्य समतुल्य हैं:

local obj = {}

function obj.foo(arg1, arg2)
  print(arg1, arg2) -- cannot use "self" here
end

function obj:bar(arg)
  print(self, arg) -- "self" is an implicit first argument before arg
end

-- All functions can be invoked both ways, with "." or with ":"

obj:foo("Foo") -- equivalent to obj.foo(obj, "Foo")
obj.bar(obj, "Bar") -- equivalent to obj:bar("Bar")

लुआ स्वयं ऑब्जेक्ट-ओरिएंटेड नहीं है, किन्तु जब इसे मेटाटेबल्स नामक अन्य सुविधा के साथ जोड़ा जाता है, तो इसका उपयोग किया जाता है self प्रोग्रामर को फ़ंक्शन को ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के समान तरीके से परिभाषित करने देता है।

पावरशेल

PowerShell में विशेष स्वचालित चर $_ पाइपलाइन ऑब्जेक्ट में वर्तमान ऑब्जेक्ट सम्मिलित है। आप इस वेरिएबल का उपयोग उन कमांड्स में कर सकते हैं जो प्रत्येक ऑब्जेक्ट पर या पाइपलाइन में चयनित ऑब्जेक्ट पर कार्रवाई करते हैं।[21] <सिंटैक्सहाइलाइट लैंग=पीएस1 >

एक , दो , तीन | % { $_ लिखें }

</सिंटैक्सहाइलाइट>पॉवरशेल 5.0 से भी प्रारंभ होता है, जो कक्षाओं और अन्य उपयोगकर्ता-परिभाषित प्रकारों को परिभाषित करने के लिए औपचारिक वाक्यविन्यास जोड़ता है,[22] $this वेरिएबल ऑब्जेक्ट के वर्तमान उदाहरण का वर्णन करता है।

पायथन

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

कक्षा विधियों में (के साथ बनाया गया classmethod डेकोरेटर), पहला तर्क क्लास ऑब्जेक्ट को ही संदर्भित करता है, और इसे पारंपरिक रूप से कहा जाता है cls; इनका उपयोग मुख्य रूप से इनहेरिटेबल कंस्ट्रक्टर्स के लिए किया जाता है,[23] जहां पैरामीटर के रूप में क्लास का उपयोग कंस्ट्रक्टर को उपवर्गीकृत करने की अनुमति देता है। स्थैतिक तरीकों में (के साथ बनाया गया staticmethod डेकोरेटर), कोई विशेष पहला तर्क उपस्तिथ नहीं है।

जंग

रस्ट में, प्रकारों को उनसे जुड़े कार्यों से अलग घोषित किया जाता है। पारंपरिक रूप से ऑब्जेक्ट-ओरिएंटेड भाषाओं में इंस्टेंस विधियों के अनुरूप डिज़ाइन किए गए फ़ंक्शंस को स्पष्ट रूप से लिया जाना चाहिए self उनके पहले पैरामीटर के रूप में। फिर इन फ़ंक्शंस का उपयोग करके कॉल किया जा सकता है instance.method() सिंटैक्स चीनी. उदाहरण के लिए:

struct Foo {
    bar: i32,
}

impl Foo {
    fn new() -> Foo {
        Foo { bar: 0, }
    }
    fn refer(&self) {
        println!("{}", self.bar);
    }
    fn mutate(&mut self, baz: i32) {
        self.bar = baz;
    }
    fn consume(self) {
        self.refer();
    }
}

यह प्रकार को परिभाषित करता है, Foo, जिसके चार संबद्ध कार्य हैं। पहला, Foo::new(), इंस्टेंस फ़ंक्शन नहीं है और इसे प्रकार उपसर्ग के साथ निर्दिष्ट किया जाना चाहिए। शेष तीन सभी लेते हैं self विभिन्न तरीकों से पैरामीटर, और इसे a पर कॉल किया जा सकता है Foo उदाहरण के लिए डॉट-नोटेशन सिंटैक्स शुगर का उपयोग किया जाता है, जो स्पष्ट रूप से टाइप-योग्य फ़ंक्शन नाम को कॉल करने के बराबर है self पहला पैरामीटर.

let mut foo = Foo::new(); // must called as a type-specified function
foo.refer(); // prints "0". Foo::refer() has read-only access to the foo instance
foo.mutate(5); // mutates foo in place, permitted by the &mut specification, need foo to be declared mut
foo.consume(); // prints "5" and destroys foo, as Foo::consume() takes full ownership of self

//  equivalent to foo.refer()
Foo::refer(foo); // compilation error: foo is out of scope

स्वयं

Self (प्रोग्रामिंग भाषा) भाषा का नाम self के इसी प्रयोग के आधार पर रखा गया है।

एक्सबेस++

Self किसी वर्ग के तरीकों के भीतर सख्ती से उपयोग किया जाता है।

संदर्भित करने का दूसरा प्रणाली Self उपयोग करना है ::.

यह भी देखें

संदर्भ

  1. Dahl, Ole-Johan; Myhrhaug, Bjørn; Nygaard, Kristen (1970). "Common Base Language, Norwegian Computing Center".
  2. Powell, Thomas A, and Schneider, Fritz, 2012. JavaScript: The Complete Reference, Third Edition. McGraw-Hill. Chapter 11, Event Handling, p 428. ISBN 978-0-07-174120-0
  3. Using the GNU Compiler Collection (GCC) – Bound member functions
  4. "Closed and Open Recursion", Ralf Hinze, July 2007
  5. Open Recursion, Lambda the Ultimate
  6. "Selective Open Recursion: A Solution to the Fragile Base Class Problem", Jonathan Aldrich
  7. "Selective Open Recursion: A Solution to the Fragile Base Class Problem", Lambda the Ultimate
  8. Aldrich, Jonathan, and Kevin Donnelly. "Selective open recursion: Modular reasoning about components and inheritance." SAVCBS 2004 Specification and Verification of Component-Based Systems (2004): 26. citing for the JDK-adopted solution C. Ruby and G. T. Leavens. "Safely Creating Correct Subclasses without Seeing Superclass Code". In Object-Oriented Programming Systems, Languages, and Applications, October 2000. doi:10.1145/353171.353186 also available as technical report TR #00-05d
  9. ISO/IEC 14882:2003(E): Programming Languages - C++. ISO/IEC. 2003.
  10. Stroustrup: C++ Style and Technique FAQ
  11. De Smet, Bart, 2011. C# 4.0 Unleashed. Sams Publishing, Indianapolis, USA. Chapter 4, Language Essentials, p 210. ISBN 978-0-672-33079-7
  12. NOTE: The line numbers are for reference purposes only. Eiffel does not have line numbers in the class text. However, there is a line number option in the Eiffel Studio IDE, which can be optionally turned on for reference purposes (e.g. pair programming, etc).
  13. Barnes, D. and Kölling, M. Objects First with Java. "...the reason for using this construct [this] is that we have a situation that is known as name overloading - the same name being used for two different entities... It is important to understand that the fields and the parameters are separate variables that exist independently of each other, even though they share similar names. A parameter and a field sharing a name is not really a problem in Java."[citation needed]
  14. Crockford, Douglas, 2008. JavaScript: The Good Parts. O'Reilly Media Inc. and Yahoo! Inc. Chapter 4, Functions, p 28. ISBN 978-0-596-51774-8
  15. Powell, Thomas A, and Schneider, Fritz, 2012. JavaScript: The Complete Reference, Third Edition. McGraw-Hill. Chapter 5, Functions, pp 170–1. ISBN 978-0-07-174120-0
  16. Goodman, Danny, with Morrison, Michael, 2004. JavaScript Bible, 5th Edition. Wiley Publishing, Inc., Indianapolis, USA. Chapter 33, Functions and Custom Objects, p 987. ISBN 0-7645-5743-2
  17. Mozilla Developer Network: Window.self
  18. Mozilla Developer Network: Web Worker API
  19. Mozilla Developer Network: globalThis
  20. "Programming in Lua : 16".
  21. msdn. "PowerShell: About Automatic Variables". docs.microsoft.com (in English). Retrieved 2018-03-22.
  22. msdn. "about_Classes". docs.microsoft.com (in English). Retrieved 2018-12-17.
  23. Unifying types and classes in Python 2.2, Guido van Rossum, "Overriding the __new__ method"

अग्रिम पठन