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

From Vigyanwiki
(Created page with "{{short description|In programming languages, the object or class the currently running code belongs to}} {{lowercase}} यह, स्वयं, और मी आरक्...")
 
No edit summary
 
(26 intermediate revisions by 4 users not shown)
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}}
{{lowercase}}
'''this, self,''' और '''Me''' ऐसे [[स्वचालित चर|कीवर्ड]] हैं जिनका उपयोग कुछ कंप्यूटर [[स्वचालित चर|प्रोग्रामिंग लैंग्वेज]] में ऑब्जेक्ट, क्लास या अन्य इकाई को संदर्भित करने के लिए किया जाता है, जिसका वर्तमान में चल रहा कोड एक भाग है। इन कीवर्ड द्वारा संदर्भित इकाई इस प्रकार [[स्वचालित चर|निष्पादन संदर्भ]] पर निर्भर करती है (जैसे कि किस ऑब्जेक्ट की विधि कहलाती है)। भिन्न-भिन्न प्रोग्रामिंग भाषाएं इन कीवर्ड का उपयोग थोड़े भिन्न विधि से करती हैं। उन लैंग्वेज में जहां '''"this"''' जैसा कीवर्ड अनिवार्य है, कीवर्ड वर्तमान ऑब्जेक्ट में संग्रहीत डेटा और विधियों तक पहुंचने का एकमात्र प्रणाली है। जहां वैकल्पिक हो, वह एक ही नाम से वेरिएबल और फ़ंक्शंस को स्पष्ट कर सकते हैं।
यह, स्वयं, और मी [[आरक्षित शब्द]] हैं जिनका उपयोग कुछ कंप्यूटर [[प्रोग्रामिंग भाषा]]ओं में ऑब्जेक्ट, क्लास या अन्य इकाई को संदर्भित करने के लिए किया जाता है जिसका वर्तमान में चल रहा कोड एक हिस्सा है। इन कीवर्ड द्वारा संदर्भित इकाई इस प्रकार निष्पादन संदर्भ पर निर्भर करती है (जैसे कि किस ऑब्जेक्ट की विधि कहलाती है)। अलग-अलग प्रोग्रामिंग भाषाएं इन कीवर्ड का उपयोग थोड़े अलग तरीके से करती हैं। उन भाषाओं में जहां इस तरह का कीवर्ड अनिवार्य है, कीवर्ड वर्तमान ऑब्जेक्ट में संग्रहीत डेटा और विधियों तक पहुंचने का एकमात्र तरीका है। जहां वैकल्पिक हो, वे एक ही नाम से वेरिएबल और फ़ंक्शंस को स्पष्ट कर सकते हैं।


==वस्तु-उन्मुख प्रोग्रामिंग==
== ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ==
कई [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]]|ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, <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 भाषा, [[स्वचालित चर|SIMULA 67]], ने स्थानीय ऑब्जेक्ट को स्पष्ट रूप से संदर्भित करने के लिए <code>this</code>उपयोग किया। [[स्वचालित चर|C++]] और इससे शैली प्राप्त करने वाली भाषाएं (जैसे [[स्वचालित चर|Java, C#, D, और PHP]]) भी सामान्यतः इसका उपयोग करती हैं। [[स्वचालित चर|स्मॉलटॉक]] और अन्य, जैसे [[स्वचालित चर|ऑब्जेक्ट पास्कल, पर्ल, पायथन, रूबी, रस्ट, ऑब्जेक्टिव-सी, डेटाफ्लेक्स]] और [[स्वचालित चर|स्विफ्ट]], <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>
अवधारणा सभी लैंग्वेज में समान है: यह सामान्यतः एक अपरिवर्तनीय [[स्वचालित चर|संदर्भ]] या [[स्वचालित चर|सूचक]] है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अधिकांशतः वह कोड होता है जो उस [[स्वचालित चर|संपत्ति, विधि,]] उप-दिनचर्या या वेरिएबल के लिए '''<nowiki/>'पैरेंट'''' या '''<nowiki/>'इनवॉकेंट'''' के रूप में कार्य करता है जिसमें <code>this</code>कीवर्ड सम्मिलित होता है। किसी ऑब्जेक्ट के ठीक से निर्माण या इंस्टेंटिअटेशन के पश्चात्, <code>this</code>सदैव एक वैध संदर्भ होता है। कुछ लैंग्वेज को स्पष्ट रूप से इसकी आवश्यकता होती है; अन्य लोग अपने वर्ग के प्रतीकों को दृश्यमान बनाने के लिए इसका अंतर्निहित रूप से उपयोग करने के लिए [[स्वचालित चर|लेक्सिकल स्कोपिंग]] का उपयोग करते हैं। या वैकल्पिक रूप से, इसके द्वारा संदर्भित वर्तमान ऑब्जेक्ट एक स्वतंत्र कोड ऑब्जेक्ट हो सकता है जिसने कीवर्ड वाले वेरिएबल या विधि को कॉल किया है। ऐसी बात होती है, उदाहरण के लिए, जब एक वेब पेज में एचटीएमएल टैग से जुड़ा एक [[स्वचालित चर|जावास्क्रिप्ट]] ईवेंट हैंडलर दस्तावेज़ ऑब्जेक्ट के बाहर वैश्विक स्थान में संग्रहीत कीवर्ड वाले वेरिएबल को कॉल करता है; उस संदर्भ में, <code>this</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, और 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> का उपयोग करता है।
जब अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है <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>
== सूक्ष्मताएँ और कठिनाइयाँ ==
जब <code>this</code>अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है, तब कोड में <code>this</code>उपयोग, चूंकि अवैध नहीं है, एक रखरखाव प्रोग्रामर के लिए चेतावनी की घंटी बजा सकता है, चूंकि इस स्थितियों में अभी भी इसके वैध उपयोग हैं, जैसे कि स्थानीय द्वारा छिपाए गए उदाहरण चर का संदर्भ देना एक ही नाम के चर, या यदि विधि वर्तमान ऑब्जेक्ट का संदर्भ वापस करना चाहती है, अर्थात <code>this</code>, स्वयं।


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


===खुला प्रत्यावर्तन===
'''खुला प्रत्यावर्तन'''
का प्रेषण शब्दार्थ <code>this</code>, अर्थात् वह विधि चालू रहती है <code>this</code> गतिशील रूप से प्रेषित होते हैं, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका मतलब है कि ये विधियां व्युत्पन्न कक्षाओं या ऑब्जेक्ट्स द्वारा ओवरराइडिंग की जा सकती हैं। इसके विपरीत, किसी फ़ंक्शन का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन <code>__SUB__</code> वर्तमान फ़ंक्शन का संदर्भ है:
 
<syntaxhighlight lang="perl">
<code>this</code> प्रेषण शब्दार्थ, अर्थात् <code>this</code>पर विधि कॉल गतिशील रूप से प्रेषित की जाती है, इसे '''ओपन रिकर्सन''' के रूप में जाना जाता है, और <code>this</code>कारण है कि इन विधियों को व्युत्पन्न वर्गों या वस्तुओं द्वारा ओवरराइड किया जा सकता है। इसके विपरीत, किसी वेरिएबल का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ '''बंद रिकर्सन''' का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन <code>__SUB__</code> वर्तमान वेरिएबल का संदर्भ है:
use feature ":5.16";
use feature ":5.16";                                                                                                                           sub {
sub {
    my $x = shift;
    my $x = shift;
    $x == 0 ? 1 : $x * __SUB__->( $x - 1 );
    $x == 0 ? 1 : $x * __SUB__->( $x - 1 );
}
}
इसके विपरीत, C++ में (स्पष्टता के लिए एक स्पष्ट <code>this</code>का उपयोग करना, चूंकि आवश्यक नहीं है) <code>this</code> ऑब्जेक्ट से ही जुड़ता है, किन्तु यदि क्लास विधि को '''"आभासी"''' अर्थात आधार में बहुरूपी घोषित किया गया था, तब इसे गतिशील प्रेषण ([[स्वचालित चर|देर से बाइंडिंग]]) के माध्यम से हल किया जाता है। जिससे कि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें।
</syntaxhighlight>
unsigned int factorial(unsigned int n)                                                 {
इसके विपरीत, C++ में (स्पष्ट का उपयोग करके <code>this</code> स्पष्टता के लिए, हालांकि आवश्यक नहीं) <code>this</code> ऑब्जेक्ट से ही जुड़ जाता है, लेकिन यदि क्लास विधि को आधार में वर्चुअल यानी बहुरूपी घोषित किया गया था, तो इसे डायनेमिक डिस्पैच (देर [[देर से बंधन]]) के माध्यम से हल किया जाता है ताकि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें।
  if (n == 0)
<syntaxhighlight lang="cpp">
    return 1;
unsigned int factorial(unsigned int n)
  else
{
    return n * this->factorial(n - 1);
  if (n == 0)
}
    return 1;
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष पुनरावर्तन है, इसलिए <code>फैक्टोरियल</code>विधि को ओवरराइड करना इस वेरिएबल को ओवरराइड कर देगा; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में एक विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के स्थितियों में उसी विधि को कॉल करती है।
  else
 
    return n * this->factorial(n - 1);
[[स्वचालित चर|नाजुक आधार वर्ग]] समस्या को खुले रिकर्सन पर दोषी ठहराया गया है, इस सुझाव के साथ कि खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के अतिरिक्त बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए <code>this</code> डिफ़ॉल्ट पर विधियों को प्रयुक्त करना, केवल खुले रिकर्सन का उपयोग करना जब यह हो विशेष रूप से अनुरोध किया गया; बाहरी कॉल (<code>this</code>उपयोग नहीं करते हुए) सदैव की तरह गतिशील रूप से भेजी जाएंगी। जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह एक निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम सम्मिलित हैं:
}
 
</syntaxhighlight>
* <code>this</code>पर कोई भी कोड <code>public</code> तरीकों का आह्वान नहीं करता है।
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष प्रत्यावर्तन है, इसलिए ओवरराइडिंग है <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>protected</code>या <code>private</code>जी विधि में समाहित किया गया है; यदि इसे सीधे उपयोगकर्ताओं के सामने उजागर करने की आवश्यकता है, तब एक रैपर <code>public</code> विधि आंतरिक विधि को कॉल करती है।
* कोई कोड लागू नहीं होता <code>public</code> तरीकों पर <code>this</code>.
 
* कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) एक में समाहित किया गया है <code>protected</code> या <code>private</code> तरीका; यदि इसे सीधे उपयोगकर्ताओं के सामने प्रदर्शित करने की आवश्यकता है, तो एक आवरण <code>public</code> विधि आंतरिक विधि को कॉल करती है।
* [[स्वचालित चर|शुद्ध]] तरीकों के लिए पिछली अनुशंसा में ढील दी जा सकती है।
* [[शुद्ध कार्य]] विधियों के लिए पिछली अनुशंसा में ढील दी जा सकती है।


== कार्यान्वयन ==
== कार्यान्वयन ==
'''सी++'''


=== सी++ ===
अधिक जानकारी: C++ कक्षाएं
{{details|C++ classes}}


C++ के शुरुआती संस्करण इसकी अनुमति देंगे <code>this</code> सूचक बदला जाए; ऐसा करने से एक प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। यह सुविधा अंततः हटा दी गई, और अब <code>this</code> C++ में एक वैल्यू (कंप्यूटर साइंस)#असाइनमेंट है: एल-वैल्यू और आर-वैल्यू|आर-वैल्यू।<ref name="C++03">{{cite book
C++ के प्रारंभिक संस्करण <code>this</code>सूचक को बदलने देंगे; ऐसा करने से एक प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। अंततः <code>this</code>सुविधा को हटा दिया गया, और अब C++ में यह एक [[स्वचालित चर|r-value]] है।
| year = 2003
| title = ISO/IEC 14882:2003(E): Programming Languages - C++
| publisher = ISO/IEC
}}
</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++ के प्रारंभिक संस्करणों में संदर्भ सम्मिलित नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, तब <code>this</code>एक संदर्भ होता, सूचक नहीं।
{{details|C Sharp (programming language)}}
कीवर्ड <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>
C++ ऑब्जेक्ट को सोर्स कोड स्टेटमेंट के साथ स्वयं को नष्ट करने देता है: <code>delete this</code>


'''सी#'''


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


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


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


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


=== एफिल ===
[[स्वचालित चर|डी]] में <code>this</code>एक वर्ग, संरचना या संघ विधि में संलग्न समुच्चय के उदाहरण के एक अपरिवर्तनीय संदर्भ को [[स्वचालित चर|संदर्भित]] करता है। कक्षाएं संदर्भ प्रकार हैं, संरचनाएं और यूनियन मूल्य प्रकार हैं। डी के पहले संस्करण में, कीवर्ड का उपयोग <code>this</code> ऑब्जेक्ट के उदाहरण के लिए सूचक के रूप में किया जाता है जिससे विधि जुड़ी हुई है, जबकि डी 2 में इसमें एक अंतर्निहित <code>ref</code>रेफरी वेरिएबल तर्क का चरित्र होता है।
एक वर्ग पाठ के भीतर, वर्तमान प्रकार वर्तमान वर्ग से प्राप्त प्रकार है। किसी कक्षा की सुविधाओं (दिनचर्या, आदेश और प्रश्न) के भीतर, कोई कीवर्ड का उपयोग कर सकता है <code>Current</code> वर्तमान वर्ग और उसकी विशेषताओं का संदर्भ देने के लिए। कीवर्ड का उपयोग <code>Current</code> कीवर्ड के रूप में वैकल्पिक है <code>Current</code> इसका तात्पर्य केवल वर्तमान वर्ग सुविधा के नाम को खुले तौर पर संदर्भित करना है। उदाहरण के लिए: किसी के पास क्लास MY_CLASS में `फू' सुविधा हो सकती है और इसे इसके द्वारा संदर्भित किया जा सकता है:


<सिंटैक्सहाइलाइट लैंग= एफिल लाइन हाइलाइट= 10 >
'''डायलन'''
  कक्षा
    मेरी कक्षा
 
  सुविधा--पहुँच
 
    foo: पूर्णांक
 
    मेरा_फ़ंक्शन: पूर्णांक
        करना
          परिणाम:= फू
      अंत
अंत
</सिंटैक्सहाइलाइट><ref>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).</ref>
पंक्ति #10 (ऊपर) का निहित संदर्भ है <code>Current</code> सरल `फू' पर कॉल करके।


पंक्ति #10 (नीचे) का स्पष्ट संदर्भ है <code>Current</code> `Current.foo' पर कॉल द्वारा।
प्रोग्रामिंग भाषा [[स्वचालित चर|डायलन]] में, जो एक ऑब्जेक्ट-ओरिएंटेड भाषा है जो [[स्वचालित चर|मल्टीमेथड्स]] का समर्थन करती है और <code>this</code>कोई अवधारणा नहीं है, किसी ऑब्जेक्ट को संदेश भेजना अभी भी सिंटैक्स में रखा जाता है। नीचे दिए गए दोनों फॉर्म एक ही तरह से काम करते हैं; अंतर केवल [[स्वचालित चर|वाक्यात्मक शर्करा]] है।
object.method(param1, param2)
और
method (object, param1, param2)


<सिंटैक्सहाइलाइट लैंग= एफिल लाइन हाइलाइट= 10 >
== '''एफिल''' ==
  कक्षा
एक वर्ग पाठ के अंदर, '''वर्तमान प्रकार''' '''वर्तमान वर्ग''' से प्राप्त प्रकार है। किसी क्लास की सुविधाओं (रूटीन, कमांड और क्वेरीज़) के अंदर, कोई व्यक्ति वर्तमान क्लास और उसकी विशेषताओं को संदर्भित करने के लिए <code>Current</code> करंट कीवर्ड का उपयोग कर सकता है। कीवर्ड <code>Current</code> का उपयोग वैकल्पिक है क्योंकि <code>Current</code> कीवर्ड का तात्पर्य केवल वर्तमान वर्ग सुविधा के नाम को खुले तौर पर संदर्भित करना है। उदाहरण के लिए: किसी के पास क्लास MY_CLASS में '''`फू'''' सुविधा हो सकती है और इसे इसके द्वारा संदर्भित किया जा सकता है:
    मेरी कक्षा
    class
      MY_CLASS
 
  feature -- Access
 
      foo: INTEGER
 
      my_function: INTEGER
        do
          Result := foo
        end
    
    
   सुविधा--पहुँच
   end
पंक्ति #10 (ऊपर) में सरल `फू' कॉल द्वारा <code>Current</code> का निहित संदर्भ है।
 
पंक्ति #10 (नीचे) में 'Current.foo' पर कॉल द्वारा <code>Current</code> का स्पष्ट संदर्भ है।
    class                                                                              MY_CLASS
 
  feature -- Access
 
      foo: INTEGER
 
      my_function: INTEGER
        do
            Result := Current.foo
        end
    
    
    foo: पूर्णांक
  end
कंपाइलर को कोई भी दृष्टिकोण स्वीकार्य है, किन्तु निहित संस्करण (जैसे <code>x:= foo</code>) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।
 
अन्य लैंग्वेज की तरह, अनेक बार <code>Current</code>कीवर्ड का उपयोग अनिवार्य होता है, जैसे:
    class                                                                                                                                  MY_CLASS
    
    
    मेरा_फ़ंक्शन: पूर्णांक
   feature -- Access
        करना
          परिणाम:=वर्तमान.फू
      अंत
अंत
</सिंटैक्सहाइलाइट>
 
कोई भी दृष्टिकोण संकलक को स्वीकार्य है, लेकिन निहित संस्करण (उदा. <code>x := foo</code>) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।
 
अन्य भाषाओं की तरह, ऐसे समय भी आते हैं जब कीवर्ड का उपयोग किया जाता है <code>Current</code> अनिवार्य है, जैसे:
 
<सिंटैक्सहाइलाइट लैंग= एफिल लाइन हाइलाइट= 11 >
   कक्षा
    मेरी कक्षा
    
    
   सुविधा--पहुँच
   my_command
            -- Create MY_OTHER_CLASS with `Current'
        local
            x: MY_OTHER_CLASS
        do
          create x.make_with_something (Current)
        end
    
    
    my_command
  end
          -- 'वर्तमान' के साथ MY_OTHER_CLASS बनाएं
उपरोक्त कोड के स्थितियों में, लाइन #11 पर '''मेक_विथ_समथिंग''' पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है <code>Current</code>.
        स्थानीय
          एक्स: मेरी_अन्य_क्लास
      करना
          x.make_with_something बनाएं (वर्तमान)
      अंत
अंत
</सिंटैक्सहाइलाइट>
 
उपरोक्त कोड के मामले में, लाइन #11 पर make_with_something पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है <code>Current</code>.


=== जावा ===
=== जावा ===
{{details|Java (programming language)}}
{{details|जावा (प्रोग्रामिंग भाषा)}}
कीवर्ड <code>this</code> एक जावा (प्रोग्रामिंग भाषा) भाषा कीवर्ड है जो उस वर्ग के वर्तमान उदाहरण का प्रतिनिधित्व करता है जिसमें यह दिखाई देता है। इसका उपयोग क्लास वेरिएबल्स और विधियों तक पहुंचने के लिए किया जाता है।
कीवर्ड <code>दिस</code> जावा (प्रोग्रामिंग भाषा) भाषा कीवर्ड है जो उस वर्ग के वर्तमान उदाहरण का प्रतिनिधित्व करता है जिसमें यह दिखाई देता है। इसका उपयोग क्लास वेरिएबल्स और विधियों तक पहुंचने के लिए किया जाता है।
 
चूँकि जावा में सभी इंस्टेंस विधियाँ आभासी हैं, <code>this</code> कभी भी शून्य नहीं हो सकता.<ref>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|date=February 2013}}</ref>
 


चूँकि जावा में सभी इंस्टेंस विधियाँ आभासी हैं, <code>दिस</code> कभी भी शून्य नहीं हो सकता.<ref>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|date=February 2013}}</ref>
=== जावास्क्रिप्ट ===
=== जावास्क्रिप्ट ===
{{details|JavaScript}}
{{details|जावास्क्रिप्ट}}
जावास्क्रिप्ट में, जो एक प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, <code>this</code> एक महत्वपूर्ण कीवर्ड है, हालाँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है।
जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, <code>दिस</code> महत्वपूर्ण कीवर्ड है, चूँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है।


* जब किसी फ़ंक्शन के बाहर, वैश्विक स्थान में उपयोग किया जाता है, <code>this</code> एन्क्लोजिंग ऑब्जेक्ट को संदर्भित करता है, जो इस मामले में एन्क्लोजिंग ब्राउज़र विंडो है <code>window</code> वस्तु।
* जब किसी फलन के बाहर, वैश्विक स्थान में उपयोग किया जाता है, <code>दिस</code> एन्क्लोजिंग ऑब्जेक्ट को संदर्भित करता है, जो इस स्थितियों में एन्क्लोजिंग ब्राउज़र विंडो है <code>विंडो</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> कॉलिंग एचटीएमएल तत्व को संदर्भित करेगा।
* जब किसी विधि का उपयोग करके कॉल किया जाता है <code>new</code> कीवर्ड (उदा. <code>var c = new Thing()</code>) फिर थिंग के भीतर  <code>this</code> थिंग ऑब्जेक्ट को ही संदर्भित करता है।
* जब किसी विधि का उपयोग करके कॉल किया जाता है <code>new</code> कीवर्ड (उदा. <code>var c = new Thing()</code>) फिर थिंग के अंदर <code>दिस</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> डीओएम ईवेंट हैंडलर जैसे नेस्टेड फ़ंक्शंस में, इसे सहेजना जावास्क्रिप्ट में सामान्य मुहावरा है <code>this</code> वेरिएबल में कॉलिंग ऑब्जेक्ट का संदर्भ (सामान्यतः कहा जाता है <code>that</code> या <code>self</code>), और फिर नेस्टेड फ़ंक्शंस में कॉलिंग ऑब्जेक्ट को संदर्भित करने के लिए वेरिएबल का उपयोग करते है।


उदाहरण के लिए:
उदाहरण के लिए:
Line 168: Line 149:
});
});
</syntaxhighlight>
</syntaxhighlight>
विशेष रूप से, जावास्क्रिप्ट दोनों का उपयोग करता है <code>this</code> और संबंधित कीवर्ड <code>self</code><ref>[https://developer.mozilla.org/en-US/docs/Web/API/Window/self ''Mozilla Developer Network'': Window.self]</ref> (अधिकांश अन्य भाषाओं के विपरीत जो एक या दूसरे को नियोजित करती हैं), साथ <code>self</code> विशेष रूप से वेब कर्मियों तक ही सीमित रखा जा रहा है।<ref>[https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API ''Mozilla Developer Network'': Web Worker API]</ref>
विशेष रूप से, जावास्क्रिप्ट दोनों का उपयोग करता है <code>this</code> और संबंधित कीवर्ड <code>self</code><ref>[https://developer.mozilla.org/en-US/docs/Web/API/Window/self ''Mozilla Developer Network'': Window.self]</ref> (अधिकांश अन्य लैंग्वेज के विपरीत जो या दूसरे को नियोजित करती हैं), साथ <code>self</code> विशेष रूप से वेब कर्मियों तक ही सीमित रखा जा रहा है।<ref>[https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API ''Mozilla Developer Network'': Web Worker API]</ref>
अंत में, वैश्विक (विंडो या समतुल्य) ऑब्जेक्ट को विशेष रूप से संदर्भित करने के एक विश्वसनीय तरीके के रूप में, जावास्क्रिप्ट की सुविधा है <code>globalThis</code> कीवर्ड.<ref>[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis ''Mozilla Developer Network'': globalThis]</ref>
 


=== दो ===
अंत में, वैश्विक (विंडो या समतुल्य) ऑब्जेक्ट को विशेष रूप से संदर्भित करने के विश्वसनीय तरीके के रूप में, जावास्क्रिप्ट की सुविधा है <code>globalThis</code> कीवर्ड.<ref>[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis ''Mozilla Developer Network'': globalThis]</ref>
{{details|Lua (programming language)}}
=== लुआ ===
लुआ में, <code>self</code> जब फ़ंक्शंस का उपयोग करके परिभाषित किया जाता है तो सिंटैक्टिक शुगर के रूप में बनाया जाता है <code>:</code> ऑपरेटर।<ref>{{Cite web|url=https://www.lua.org/pil/16.html|title = Programming in Lua : 16}}</ref> किसी विधि का उपयोग करते समय <code>:</code>, अनुक्रमित की जा रही वस्तु को अंतर्निहित रूप से लागू किए जा रहे फ़ंक्शन के पहले तर्क के रूप में दिया जाएगा।
{{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>, अनुक्रमित की जा रही वस्तु को अंतर्निहित रूप से प्रयुक्त किए जा रहे फलन के पहले तर्क के रूप में दिया जाता है।


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


<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
Line 194: Line 174:
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>
पॉवरशैल में विशेष [[स्वचालित चर]] <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 >
  "one", "two", "three" | % { write $_ }
  एक , दो , तीन | % { $_ लिखें }
पॉवरशेल 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>self</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> डेकोरेटर), कोई विशेष पहला तर्क उपस्तिथ नहीं है।


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


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


<syntaxhighlight lang="rust">
<syntaxhighlight lang="rust">
Line 241: Line 220:
Foo::refer(foo); // compilation error: foo is out of scope
Foo::refer(foo); // compilation error: foo is out of scope
</syntaxhighlight>
</syntaxhighlight>
===स्वयं ===
===स्वयं ===
Self (प्रोग्रामिंग भाषा) भाषा का नाम self के इसी प्रयोग के आधार पर रखा गया है।
<code>Self</code> (प्रोग्रामिंग भाषा) भाषा का नाम <code>"self"</code>के इसी प्रयोग के आधार पर रखा गया है।


=== एक्सबेस++ ===
=== एक्सबेस++ ===
<code>Self</code> किसी वर्ग के तरीकों के भीतर सख्ती से उपयोग किया जाता है।
<code>Self</code> किसी वर्ग के तरीकों के अंदर सख्ती से उपयोग किया जाता है।
संदर्भित करने का दूसरा तरीका <code>Self</code> उपयोग करना है <code>::</code>.
 
संदर्भित करने का दूसरा प्रणाली <code>Self</code> उपयोग करना है <code>::</code>.


== यह भी देखें ==
== '''यह भी देखें''' ==
* {{annotated link|Anonymous recursion}}
* {{annotated link|अनाम पुनरावर्तन}}
* {{annotated link|Inheritance (object-oriented programming)}}
* {{annotated link|वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग)}}
* {{annotated link|Self-reference}}
* {{annotated link|आत्म संदर्भ}}
* {{annotated link|Schizophrenia (object-oriented programming)}}
* {{annotated link|सिज़ोफ्रेनिया (वस्तु-उन्मुख प्रोग्रामिंग)}}
* {{annotated link|Program Segment Prefix}}
* {{annotated link|प्रोग्राम खंड उपसर्ग}}


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


 
[[Category:All articles with unsourced statements]]
==अग्रिम पठन==
[[Category:Articles with hatnote templates targeting a nonexistent page|This (Computer Programming)]]
* Meyers, Scott, 1995. ''More Effective C++: 35 New Ways to Improve Your Programs and Designs''. {{ISBN|0-201-63371-X}} [[Scott Meyers]]
[[Category:Articles with unsourced statements from February 2013]]
* Stroustrup, Bjarne, 1994. ''The Design and Evolution of C++''. Addison-Wesley Pub. Co. {{ISBN|0-201-54330-3}} [[Bjarne Stroustrup]]
[[Category:CS1 English-language sources (en)]]
 
[[Category:Created On 25/07/2023|This (Computer Programming)]]
 
[[Category:Lua-based templates|This (Computer Programming)]]
{{DEFAULTSORT:This (Computer Programming)}}[[Category: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]]  
[[Category:Machine Translated Page|This (Computer Programming)]]
 
[[Category:Pages with script errors|This (Computer Programming)]]
 
[[Category:Short description with empty Wikidata description|This (Computer Programming)]]
 
[[Category:Templates Vigyan Ready|This (Computer Programming)]]
[[Category: Machine Translated Page]]
[[Category:Templates that add a tracking category|This (Computer Programming)]]
[[Category:Created On 25/07/2023]]
[[Category:Templates that generate short descriptions|This (Computer Programming)]]
[[Category:Templates using TemplateData|This (Computer Programming)]]
[[Category:ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|This (Computer Programming)]]

Latest revision as of 17:11, 21 August 2023

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

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग

अनेक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज में, thisजिसे selfया Me भी कहा जाता है) एक वेरिएबल है जिसका उपयोग उदाहरण विधियों में उस ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है जिस पर वह काम कर रहे हैं। पहली OO भाषा, SIMULA 67, ने स्थानीय ऑब्जेक्ट को स्पष्ट रूप से संदर्भित करने के लिए thisउपयोग किया। C++ और इससे शैली प्राप्त करने वाली भाषाएं (जैसे Java, C#, D, और PHP) भी सामान्यतः इसका उपयोग करती हैं। स्मॉलटॉक और अन्य, जैसे ऑब्जेक्ट पास्कल, पर्ल, पायथन, रूबी, रस्ट, ऑब्जेक्टिव-सी, डेटाफ्लेक्स और स्विफ्ट, self का उपयोग करते हैं। माइक्रोसॉफ्ट का विज़ुअल बेसिक Me उपयोग करता है।

अवधारणा सभी लैंग्वेज में समान है: यह सामान्यतः एक अपरिवर्तनीय संदर्भ या सूचक है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अधिकांशतः वह कोड होता है जो उस संपत्ति, विधि, उप-दिनचर्या या वेरिएबल के लिए 'पैरेंट' या 'इनवॉकेंट' के रूप में कार्य करता है जिसमें thisकीवर्ड सम्मिलित होता है। किसी ऑब्जेक्ट के ठीक से निर्माण या इंस्टेंटिअटेशन के पश्चात्, thisसदैव एक वैध संदर्भ होता है। कुछ लैंग्वेज को स्पष्ट रूप से इसकी आवश्यकता होती है; अन्य लोग अपने वर्ग के प्रतीकों को दृश्यमान बनाने के लिए इसका अंतर्निहित रूप से उपयोग करने के लिए लेक्सिकल स्कोपिंग का उपयोग करते हैं। या वैकल्पिक रूप से, इसके द्वारा संदर्भित वर्तमान ऑब्जेक्ट एक स्वतंत्र कोड ऑब्जेक्ट हो सकता है जिसने कीवर्ड वाले वेरिएबल या विधि को कॉल किया है। ऐसी बात होती है, उदाहरण के लिए, जब एक वेब पेज में एचटीएमएल टैग से जुड़ा एक जावास्क्रिप्ट ईवेंट हैंडलर दस्तावेज़ ऑब्जेक्ट के बाहर वैश्विक स्थान में संग्रहीत कीवर्ड वाले वेरिएबल को कॉल करता है; उस संदर्भ में, thisदस्तावेज़ ऑब्जेक्ट के अंदर पृष्ठ तत्व को संदर्भित करेगा, न कि संलग्न विंडो ऑब्जेक्ट को।

कुछ लैंग्वेज में, उदाहरण के लिए C++, Java, और Raku thisया self एक कीवर्ड है, और वेरिएबल स्वचालित रूप से इंस्टेंस विधियों में उपस्तिथ होता है। दूसरों में, उदाहरण के लिए पायथन, रस्ट और पर्ल 5 में, इंस्टेंस विधि का पहला पैरामीटर एक ऐसा संदर्भ है। इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। पायथन और पर्ल में, पैरामीटर को आवश्यक रूप से thisया selfनाम देने की आवश्यकता नहीं है; इसे किसी अन्य पैरामीटर की तरह प्रोग्रामर द्वारा स्वतंत्र रूप से नामित किया जा सकता है। चूँकि, अनौपचारिक परंपरा के अनुसार, पर्ल या पायथन में इंस्टेंस विधि के पहले पैरामीटर को selfनाम दिया गया है। जंग के लिए आवश्यक है कि सेल्फ ऑब्जेक्ट को &self या selfकहा जाए, यह इस बात पर निर्भर करता है कि क्या इनवोक किया गया वेरिएबल इनवोकेंट को उधार लेता है, या इसे क्रमशः अंदर ले जाता है।

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

सूक्ष्मताएँ और कठिनाइयाँ

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

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

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

this प्रेषण शब्दार्थ, अर्थात् 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);
}

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

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

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

कार्यान्वयन

सी++

अधिक जानकारी: C++ कक्षाएं

C++ के प्रारंभिक संस्करण thisसूचक को बदलने देंगे; ऐसा करने से एक प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। अंततः thisसुविधा को हटा दिया गया, और अब C++ में यह एक r-value है।

C++ के प्रारंभिक संस्करणों में संदर्भ सम्मिलित नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, तब thisएक संदर्भ होता, सूचक नहीं।

C++ ऑब्जेक्ट को सोर्स कोड स्टेटमेंट के साथ स्वयं को नष्ट करने देता है: delete this

सी#

अधिक जानकारी: सी शार्प (प्रोग्रामिंग भाषा)

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

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

डी

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

डायलन

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

object.method(param1, param2)

और

method (object, param1, param2)

एफिल

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

   class
     MY_CLASS
  
  feature -- Access
  
     foo: INTEGER
  
     my_function: INTEGER
        do
          Result := foo
       end
 
 end

पंक्ति #10 (ऊपर) में सरल `फू' कॉल द्वारा Current का निहित संदर्भ है।

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

    class                                                                              MY_CLASS
  
  feature -- Access
  
     foo: INTEGER
  
     my_function: INTEGER
        do
           Result := Current.foo
       end
 
 end

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

अन्य लैंग्वेज की तरह, अनेक बार Currentकीवर्ड का उपयोग अनिवार्य होता है, जैसे:

    class                                                                                                                                  MY_CLASS
 
 feature -- Access
 
 my_command
           -- Create MY_OTHER_CLASS with `Current'
        local
           x: MY_OTHER_CLASS
       do
          create x.make_with_something (Current)
       end
 
 end

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

जावा

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

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

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

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

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

के विभिन्न अर्थों के इर्द-गिर्द काम करना this डीओएम ईवेंट हैंडलर जैसे नेस्टेड फ़ंक्शंस में, इसे सहेजना जावास्क्रिप्ट में सामान्य मुहावरा है 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[5] (अधिकांश अन्य लैंग्वेज के विपरीत जो या दूसरे को नियोजित करती हैं), साथ self विशेष रूप से वेब कर्मियों तक ही सीमित रखा जा रहा है।[6]

अंत में, वैश्विक (विंडो या समतुल्य) ऑब्जेक्ट को विशेष रूप से संदर्भित करने के विश्वसनीय तरीके के रूप में, जावास्क्रिप्ट की सुविधा है globalThis कीवर्ड.[7]

लुआ

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

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

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 प्रोग्रामर को फलन को ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के समान तरीके से परिभाषित करने देता है।

पावरशेल

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

"one", "two", "three" | % { write $_ }

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

पायथन

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

कक्षा विधियों में (के साथ बनाया गया classmethod डेकोरेटर), पहला तर्क क्लास ऑब्जेक्ट को ही संदर्भित करता है, और इसे पारंपरिक रूप से cls कहा जाता है, इनका उपयोग मुख्य रूप से इनहेरिटेबल कंस्ट्रक्टर्स के लिए किया जाता है,[11] जहां पैरामीटर के रूप में क्लास का उपयोग कंस्ट्रक्टर को उपवर्गीकृत करने की अनुमति देता है। इस प्रकार स्थैतिक तरीकों में (के साथ बनाया गया 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 विभिन्न तरीकों से पैरामीटर, और इसे ए पर कॉल किया जा सकता है फू उदाहरण के लिए डॉट-नोटेशन सिंटैक्स शुगर का उपयोग किया जाता है, जो स्पष्ट रूप से टाइप-योग्य फलन नाम को कॉल करने के सामान्तर है 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. 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]
  2. 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
  3. 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
  4. 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
  5. Mozilla Developer Network: Window.self
  6. Mozilla Developer Network: Web Worker API
  7. Mozilla Developer Network: globalThis
  8. "Programming in Lua : 16".
  9. msdn. "PowerShell: About Automatic Variables". docs.microsoft.com (in English). Retrieved 2018-03-22.
  10. msdn. "about_Classes". docs.microsoft.com (in English). Retrieved 2018-12-17.
  11. Unifying types and classes in Python 2.2, Guido van Rossum, "Overriding the __new__ method"

अग्रिम पठन