दिस (THIS कंप्यूटर प्रोग्रामिंग): Difference between revisions
No edit summary |
No edit summary |
||
(24 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}} | ||
'''this, self,''' और '''Me''' ऐसे [[स्वचालित चर|कीवर्ड]] हैं जिनका उपयोग कुछ कंप्यूटर [[स्वचालित चर|प्रोग्रामिंग लैंग्वेज]] में ऑब्जेक्ट, क्लास या अन्य इकाई को संदर्भित करने के लिए किया जाता है, जिसका वर्तमान में चल रहा कोड एक भाग है। इन कीवर्ड द्वारा संदर्भित इकाई इस प्रकार [[स्वचालित चर|निष्पादन संदर्भ]] पर निर्भर करती है (जैसे कि किस ऑब्जेक्ट की विधि कहलाती है)। भिन्न-भिन्न प्रोग्रामिंग भाषाएं इन कीवर्ड का उपयोग थोड़े भिन्न विधि से करती हैं। उन लैंग्वेज में जहां '''"this"''' जैसा कीवर्ड अनिवार्य है, कीवर्ड वर्तमान ऑब्जेक्ट में संग्रहीत डेटा और विधियों तक पहुंचने का एकमात्र प्रणाली है। जहां वैकल्पिक हो, वह एक ही नाम से वेरिएबल और फ़ंक्शंस को स्पष्ट कर सकते हैं। | |||
== ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग == | |||
अनेक '''[[स्वचालित चर|ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग]]''' लैंग्वेज में, <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> उपयोग करता है। | |||
अवधारणा सभी लैंग्वेज में समान है: यह सामान्यतः एक अपरिवर्तनीय [[स्वचालित चर|संदर्भ]] या [[स्वचालित चर|सूचक]] है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अधिकांशतः वह कोड होता है जो उस [[स्वचालित चर|संपत्ति, विधि,]] उप-दिनचर्या या वेरिएबल के लिए '''<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> का उपयोग करता है। | ||
== सूक्ष्मताएँ और कठिनाइयाँ == | |||
जब <code>this</code>अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है, तब कोड में <code>this</code>उपयोग, चूंकि अवैध नहीं है, एक रखरखाव प्रोग्रामर के लिए चेतावनी की घंटी बजा सकता है, चूंकि इस स्थितियों में अभी भी इसके वैध उपयोग हैं, जैसे कि स्थानीय द्वारा छिपाए गए उदाहरण चर का संदर्भ देना एक ही नाम के चर, या यदि विधि वर्तमान ऑब्जेक्ट का संदर्भ वापस करना चाहती है, अर्थात <code>this</code>, स्वयं। | |||
use feature ":5.16"; | |||
sub { | कुछ कंपाइलरों (उदाहरण के लिए [[स्वचालित चर|जीसीसी]]) में, सी++ इंस्टेंस विधियों के पॉइंटर्स को स्पष्ट रूप से इस पॉइंटर पैरामीटर के साथ सीधे किसी अन्य प्रकार के पॉइंटर पर डाला जा सकता है। | ||
'''खुला प्रत्यावर्तन''' | |||
} | |||
<code>this</code> प्रेषण शब्दार्थ, अर्थात् <code>this</code>पर विधि कॉल गतिशील रूप से प्रेषित की जाती है, इसे '''ओपन रिकर्सन''' के रूप में जाना जाता है, और <code>this</code>कारण है कि इन विधियों को व्युत्पन्न वर्गों या वस्तुओं द्वारा ओवरराइड किया जा सकता है। इसके विपरीत, किसी वेरिएबल का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ '''बंद रिकर्सन''' का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन <code>__SUB__</code> वर्तमान वेरिएबल का संदर्भ है: | |||
इसके विपरीत, C++ में (स्पष्ट | use feature ":5.16"; sub { | ||
my $x = shift; | |||
unsigned int factorial(unsigned int n) | $x == 0 ? 1 : $x * __SUB__->( $x - 1 ); | ||
{ | } | ||
इसके विपरीत, C++ में (स्पष्टता के लिए एक स्पष्ट <code>this</code>का उपयोग करना, चूंकि आवश्यक नहीं है) <code>this</code> ऑब्जेक्ट से ही जुड़ता है, किन्तु यदि क्लास विधि को '''"आभासी"''' अर्थात आधार में बहुरूपी घोषित किया गया था, तब इसे गतिशील प्रेषण ([[स्वचालित चर|देर से बाइंडिंग]]) के माध्यम से हल किया जाता है। जिससे कि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें। | |||
unsigned int factorial(unsigned int n) { | |||
if (n == 0) | |||
return 1; | |||
} | else | ||
return n * this->factorial(n - 1); | |||
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष | } | ||
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष पुनरावर्तन है, इसलिए <code>फैक्टोरियल</code>विधि को ओवरराइड करना इस वेरिएबल को ओवरराइड कर देगा; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में एक विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के स्थितियों में उसी विधि को कॉल करती है। | |||
* | |||
* कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) | [[स्वचालित चर|नाजुक आधार वर्ग]] समस्या को खुले रिकर्सन पर दोषी ठहराया गया है, इस सुझाव के साथ कि खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के अतिरिक्त बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए <code>this</code> डिफ़ॉल्ट पर विधियों को प्रयुक्त करना, केवल खुले रिकर्सन का उपयोग करना जब यह हो विशेष रूप से अनुरोध किया गया; बाहरी कॉल (<code>this</code>उपयोग नहीं करते हुए) सदैव की तरह गतिशील रूप से भेजी जाएंगी। जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह एक निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम सम्मिलित हैं: | ||
* [[शुद्ध | |||
* <code>this</code>पर कोई भी कोड <code>public</code> तरीकों का आह्वान नहीं करता है। | |||
* कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) एक <code>protected</code>या <code>private</code>जी विधि में समाहित किया गया है; यदि इसे सीधे उपयोगकर्ताओं के सामने उजागर करने की आवश्यकता है, तब एक रैपर <code>public</code> विधि आंतरिक विधि को कॉल करती है। | |||
* [[स्वचालित चर|शुद्ध]] तरीकों के लिए पिछली अनुशंसा में ढील दी जा सकती है। | |||
== कार्यान्वयन == | == कार्यान्वयन == | ||
'''सी++''' | |||
अधिक जानकारी: C++ कक्षाएं | |||
C++ के प्रारंभिक संस्करण <code>this</code>सूचक को बदलने देंगे; ऐसा करने से एक प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। अंततः <code>this</code>सुविधा को हटा दिया गया, और अब C++ में यह एक [[स्वचालित चर|r-value]] है। | |||
C++ के प्रारंभिक संस्करणों में संदर्भ सम्मिलित नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, तब <code>this</code>एक संदर्भ होता, सूचक नहीं। | |||
C++ | C++ ऑब्जेक्ट को सोर्स कोड स्टेटमेंट के साथ स्वयं को नष्ट करने देता है: <code>delete this</code> | ||
'''सी#''' | |||
अधिक जानकारी: सी शार्प (प्रोग्रामिंग भाषा) | |||
[[स्वचालित चर|C#]] में यह कीवर्ड संदर्भ प्रकारों के लिए जावा की तरह ही काम करता है। चूँकि, C# [[स्वचालित चर|मान प्रकारों]] के अंदर, इसमें अधिक भिन्न शब्दार्थ हैं, जो एक सामान्य परिवर्तनशील चर संदर्भ के समान है, और यहां तक कि किसी असाइनमेंट के बाईं ओर भी हो सकता है। | |||
और | C# में इसका एक उपयोग एक विधि के अंदर एक बाहरी फ़ील्ड चर के संदर्भ की अनुमति देना है जिसमें एक स्थानीय चर होता है जिसका नाम समान होता है। ऐसी स्थिति में, उदाहरण के लिए, कथन <code>var n = localAndFieldname;</code>विधि के अंदर स्थानीय चर <code>localAndFieldname</code> का प्रकार और मान n को निर्दिष्ट किया जाएगा, जबकि कथन <code>var n = this.localAndFieldname;</code>बाहरी फ़ील्ड चर का प्रकार और मान n को निर्दिष्ट करेगा। | ||
'''डी''' | |||
[[स्वचालित चर|डी]] में <code>this</code>एक वर्ग, संरचना या संघ विधि में संलग्न समुच्चय के उदाहरण के एक अपरिवर्तनीय संदर्भ को [[स्वचालित चर|संदर्भित]] करता है। कक्षाएं संदर्भ प्रकार हैं, संरचनाएं और यूनियन मूल्य प्रकार हैं। डी के पहले संस्करण में, कीवर्ड का उपयोग <code>this</code> ऑब्जेक्ट के उदाहरण के लिए सूचक के रूप में किया जाता है जिससे विधि जुड़ी हुई है, जबकि डी 2 में इसमें एक अंतर्निहित <code>ref</code>रेफरी वेरिएबल तर्क का चरित्र होता है। | |||
'''डायलन''' | |||
प्रोग्रामिंग भाषा [[स्वचालित चर|डायलन]] में, जो एक ऑब्जेक्ट-ओरिएंटेड भाषा है जो [[स्वचालित चर|मल्टीमेथड्स]] का समर्थन करती है और <code>this</code>कोई अवधारणा नहीं है, किसी ऑब्जेक्ट को संदेश भेजना अभी भी सिंटैक्स में रखा जाता है। नीचे दिए गए दोनों फॉर्म एक ही तरह से काम करते हैं; अंतर केवल [[स्वचालित चर|वाक्यात्मक शर्करा]] है। | |||
object.method(param1, param2) | |||
और | |||
method (object, param1, param2) | |||
== '''एफिल''' == | |||
एक वर्ग पाठ के अंदर, '''वर्तमान प्रकार''' '''वर्तमान वर्ग''' से प्राप्त प्रकार है। किसी क्लास की सुविधाओं (रूटीन, कमांड और क्वेरीज़) के अंदर, कोई व्यक्ति वर्तमान क्लास और उसकी विशेषताओं को संदर्भित करने के लिए <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 | |||
end | |||
कंपाइलर को कोई भी दृष्टिकोण स्वीकार्य है, किन्तु निहित संस्करण (जैसे <code>x:= foo</code>) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है। | |||
अन्य लैंग्वेज की तरह, अनेक बार <code>Current</code>कीवर्ड का उपयोग अनिवार्य होता है, जैसे: | |||
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 पर '''मेक_विथ_समथिंग''' पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है <code>Current</code>. | |||
उपरोक्त कोड के | |||
=== जावा === | === जावा === | ||
{{details|जावा (प्रोग्रामिंग भाषा)}} | {{details|जावा (प्रोग्रामिंग भाषा)}} | ||
कीवर्ड <code> | कीवर्ड <code>दिस</code> जावा (प्रोग्रामिंग भाषा) भाषा कीवर्ड है जो उस वर्ग के वर्तमान उदाहरण का प्रतिनिधित्व करता है जिसमें यह दिखाई देता है। इसका उपयोग क्लास वेरिएबल्स और विधियों तक पहुंचने के लिए किया जाता है। | ||
चूँकि जावा में सभी इंस्टेंस विधियाँ आभासी हैं, <code> | चूँकि जावा में सभी इंस्टेंस विधियाँ आभासी हैं, <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|जावास्क्रिप्ट}} | {{details|जावास्क्रिप्ट}} | ||
जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, <code> | जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है, <code>दिस</code> महत्वपूर्ण कीवर्ड है, चूँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है। | ||
* जब किसी | * जब किसी फलन के बाहर, वैश्विक स्थान में उपयोग किया जाता है, <code>दिस</code> एन्क्लोजिंग ऑब्जेक्ट को संदर्भित करता है, जो इस स्थितियों में एन्क्लोजिंग ब्राउज़र विंडो है <code>विंडो</code> वस्तु। | ||
* जब ग्लोबल स्पेस में परिभाषित किसी | * जब ग्लोबल स्पेस में परिभाषित किसी फलन में उपयोग किया जाता है, तब कीवर्ड क्या होता है <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>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–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> | के विभिन्न अर्थों के इर्द-गिर्द काम करना <code>this</code> डीओएम ईवेंट हैंडलर जैसे नेस्टेड फ़ंक्शंस में, इसे सहेजना जावास्क्रिप्ट में सामान्य मुहावरा है <code>this</code> वेरिएबल में कॉलिंग ऑब्जेक्ट का संदर्भ (सामान्यतः कहा जाता है <code>that</code> या <code>self</code>), और फिर नेस्टेड फ़ंक्शंस में कॉलिंग ऑब्जेक्ट को संदर्भित करने के लिए वेरिएबल का उपयोग करते है। | ||
उदाहरण के लिए: | उदाहरण के लिए: | ||
Line 160: | 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>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|लुआ (प्रोग्रामिंग भाषा)}} | {{details|लुआ (प्रोग्रामिंग भाषा)}} | ||
लुआ में, <code>self</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>, अनुक्रमित की जा रही वस्तु को अंतर्निहित रूप से प्रयुक्त किए जा रहे फलन के पहले तर्क के रूप में दिया जाता है। | ||
उदाहरण के लिए, निम्नलिखित दो कार्य समतुल्य | उदाहरण के लिए, निम्नलिखित दो कार्य समतुल्य होते हैं। | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
Line 184: | 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>$_</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> | |||
"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> वेरिएबल ऑब्जेक्ट के वर्तमान उदाहरण का वर्णन करता है। | |||
===पायथन === | ===पायथन === | ||
पायथन में, के लिए कोई कीवर्ड नहीं है <code>this</code>. जब किसी सदस्य | पायथन में, के लिए कोई कीवर्ड नहीं है <code>this</code>. जब किसी सदस्य फलन को किसी ऑब्जेक्ट पर कॉल किया जाता है, तब यह ऑब्जेक्ट के क्लास ऑब्जेक्ट पर उसी नाम के साथ सदस्य फलन को आमंत्रित करता है, ऑब्जेक्ट स्वचालित रूप से फलन के पहले तर्क से जुड़ा होता है। इस प्रकार, विधि (कंप्यूटर प्रोग्रामिंग) का अनिवार्य पहला पैरामीटर के रूप में कार्य करता है <code>self</code>; इस पैरामीटर को पारंपरिक रूप से नाम दिया गया है <code>self</code>, किन्तु नाम कुछ भी रखा जा सकता है। | ||
कक्षा विधियों में (के साथ बनाया गया <code>classmethod</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> सिंटैक्स चीनी. उदाहरण के लिए: | ||
<syntaxhighlight lang="rust> | <syntaxhighlight lang="rust> | ||
Line 220: | Line 209: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यह प्रकार को परिभाषित करता है, <code>Foo</code>, जिसके चार संबद्ध कार्य हैं। पहला, <code>Foo::new()</code>, इंस्टेंस | यह प्रकार को परिभाषित करता है, <code>Foo</code>, जिसके चार संबद्ध कार्य हैं। पहला, <code>Foo::new()</code>, इंस्टेंस फलन नहीं है और इसे प्रकार उपसर्ग के साथ निर्दिष्ट किया जाना चाहिए। शेष तीन सभी लेते हैं <code>self</code> विभिन्न तरीकों से पैरामीटर, और इसे ए पर कॉल किया जा सकता है <code>फू</code> उदाहरण के लिए डॉट-नोटेशन सिंटैक्स शुगर का उपयोग किया जाता है, जो स्पष्ट रूप से टाइप-योग्य फलन नाम को कॉल करने के सामान्तर है <code>self</code> पहला पैरामीटर. | ||
<syntaxhighlight lang="rust"> | <syntaxhighlight lang="rust"> | ||
Line 232: | Line 221: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===स्वयं === | ===स्वयं === | ||
Self (प्रोग्रामिंग भाषा) भाषा का नाम self के इसी प्रयोग के आधार पर रखा गया है। | <code>Self</code> (प्रोग्रामिंग भाषा) भाषा का नाम <code>"self"</code>के इसी प्रयोग के आधार पर रखा गया है। | ||
=== एक्सबेस++ === | === एक्सबेस++ === | ||
<code>Self</code> किसी वर्ग के तरीकों के | <code>Self</code> किसी वर्ग के तरीकों के अंदर सख्ती से उपयोग किया जाता है। | ||
संदर्भित करने का दूसरा | संदर्भित करने का दूसरा प्रणाली <code>Self</code> उपयोग करना है <code>::</code>. | ||
== यह भी देखें == | == '''यह भी देखें''' == | ||
* {{annotated link|अनाम पुनरावर्तन}} | * {{annotated link|अनाम पुनरावर्तन}} | ||
* {{annotated link|वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग)}} | * {{annotated link|वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग)}} | ||
Line 246: | Line 235: | ||
* {{annotated link|प्रोग्राम खंड उपसर्ग}} | * {{annotated link|प्रोग्राम खंड उपसर्ग}} | ||
== संदर्भ == | == '''संदर्भ''' == | ||
{{Reflist|30em}} | {{Reflist|30em}} | ||
==अग्रिम पठन== | =='''अग्रिम पठन'''== | ||
* मेयर्स, स्कॉट, 1995। अधिक प्रभावी सी++: आपके प्रोग्राम और डिज़ाइन को | * मेयर्स, स्कॉट, 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)}} | {{DEFAULTSORT:This (Computer Programming)}} | ||
[[Category: | [[Category:All articles with unsourced statements]] | ||
[[Category:Created On 25/07/2023]] | [[Category:Articles with hatnote templates targeting a nonexistent page|This (Computer Programming)]] | ||
[[Category:Articles with unsourced statements from February 2013]] | |||
[[Category:CS1 English-language sources (en)]] | |||
[[Category:Created On 25/07/2023|This (Computer Programming)]] | |||
[[Category:Lua-based templates|This (Computer Programming)]] | |||
[[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:Templates that add a tracking category|This (Computer Programming)]] | |||
[[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
उपयोग करना है ::
.
यह भी देखें
- अनाम पुनरावर्तन – Recursion without calling a function by name
- वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग)
- आत्म संदर्भ
- सिज़ोफ्रेनिया (वस्तु-उन्मुख प्रोग्रामिंग)
- प्रोग्राम खंड उपसर्ग
संदर्भ
- ↑ 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]
- ↑ 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
- ↑ 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
- ↑ 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
- ↑ Mozilla Developer Network: Window.self
- ↑ Mozilla Developer Network: Web Worker API
- ↑ Mozilla Developer Network: globalThis
- ↑ "Programming in Lua : 16".
- ↑ msdn. "PowerShell: About Automatic Variables". docs.microsoft.com (in English). Retrieved 2018-03-22.
- ↑ msdn. "about_Classes". docs.microsoft.com (in English). Retrieved 2018-12-17.
- ↑ Unifying types and classes in Python 2.2, Guido van Rossum, "Overriding the __new__ method"
अग्रिम पठन
- मेयर्स, स्कॉट, 1995। अधिक प्रभावी सी++: आपके प्रोग्राम और डिज़ाइन को उत्तम बनाने के 35 नए तरीके। ISBN 0-201-63371-X स्कॉट मेयर्स
- स्ट्रॉस्ट्रुप, बर्जने, 1994। सी++ का डिज़ाइन और विकास। एडिसन-वेस्ले पब। कं ISBN 0-201-54330-3 बज़्ने स्ट्रॉस्ट्रुप