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

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{short description|In programming languages, the object or class the currently running code belongs to}}
{{short description|In programming languages, the object or class the currently running code belongs to}}
कोई भी दृष्टिकोण संकलक को स्वीकार्य है, किन्तु निहित संस्करण (उदा. <code>एक्स:= फू</code>) को प्राथमिकता दी जाती है जिससे कि यह कम क्रियात्मक है।
'''यह, स्वयं,''' और '''मी''' ऐसे कीवर्ड हैं जिनका उपयोग कुछ कंप्यूटर प्रोग्रामिंग भाषाओं में ऑब्जेक्ट, क्लास या अन्य इकाई को संदर्भित करने के लिए किया जाता है, जिसका वर्तमान में चल रहा कोड एक भाग है। इन कीवर्ड द्वारा संदर्भित इकाई इस प्रकार निष्पादन संदर्भ पर निर्भर करती है (जैसे कि किस ऑब्जेक्ट की विधि कहलाती है)। अलग-अलग प्रोग्रामिंग भाषाएं इन कीवर्ड का उपयोग थोड़े अलग विधि से करती हैं। उन भाषाओं में जहां '''"यह"''' जैसा कीवर्ड अनिवार्य है, कीवर्ड वर्तमान ऑब्जेक्ट में संग्रहीत डेटा और विधियों तक पहुंचने का एकमात्र प्रणाली है। जहां वैकल्पिक हो, वे एक ही नाम से वेरिएबल और फ़ंक्शंस को स्पष्ट कर सकते हैं।


अन्य भाषाओं की तरह, ऐसे समय भी आते हैं जब कीवर्ड का उपयोग किया जाता है <code>करंट</code> अनिवार्य है, जैसे:
== ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ==
  कक्षा
कई ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, यह (जिसे सेल्फ या मी भी कहा जाता है) एक वेरिएबल है जिसका उपयोग उदाहरण विधियों में उस ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है जिस पर वे काम कर रहे हैं। पहली OO भाषा, SIMULA 67, ने स्थानीय ऑब्जेक्ट को स्पष्ट रूप से संदर्भित करने के लिए इसका उपयोग किया।[1]: 4.3.2.3  C++ और इससे शैली प्राप्त करने वाली भाषाएं (जैसे Java, C#, D, और PHP) भी आम तौर पर इसका उपयोग करती हैं। स्मॉलटॉक और अन्य, जैसे ऑब्जेक्ट पास्कल, पर्ल, पायथन, रूबी, रस्ट, ऑब्जेक्टिव-सी, डेटाफ्लेक्स और स्विफ्ट, स्वयं का उपयोग करते हैं। माइक्रोसॉफ्ट का विज़ुअल बेसिक मेरा उपयोग करता है।
  मेरी कक्षा
 
अवधारणा सभी भाषाओं में समान है: यह आमतौर पर एक अपरिवर्तनीय संदर्भ या सूचक है जो वर्तमान वस्तु को संदर्भित करता है; वर्तमान ऑब्जेक्ट अक्सर वह कोड होता है जो उस संपत्ति, विधि, उप-दिनचर्या या फ़ंक्शन के लिए 'पैरेंट' या 'इनवॉकेंट' के रूप में कार्य करता है जिसमें यह कीवर्ड शामिल होता है। किसी ऑब्जेक्ट के ठीक से निर्माण या इंस्टेंटिअटेशन के बाद, यह हमेशा एक वैध संदर्भ होता है। कुछ भाषाओं को स्पष्ट रूप से इसकी आवश्यकता होती है; अन्य लोग अपने वर्ग के प्रतीकों को दृश्यमान बनाने के लिए इसका अंतर्निहित रूप से उपयोग करने के लिए लेक्सिकल स्कोपिंग का उपयोग करते हैं। या वैकल्पिक रूप से, इसके द्वारा संदर्भित वर्तमान ऑब्जेक्ट एक स्वतंत्र कोड ऑब्जेक्ट हो सकता है जिसने कीवर्ड वाले फ़ंक्शन या विधि को कॉल किया है। ऐसी बात होती है, उदाहरण के लिए, जब एक वेब पेज में HTML टैग से जुड़ा एक जावास्क्रिप्ट ईवेंट हैंडलर दस्तावेज़ ऑब्जेक्ट के बाहर वैश्विक स्थान में संग्रहीत कीवर्ड वाले फ़ंक्शन को कॉल करता है; उस संदर्भ में, यह दस्तावेज़ ऑब्जेक्ट के भीतर पृष्ठ तत्व को संदर्भित करेगा, न कि संलग्न विंडो ऑब्जेक्ट को। [2]
 
कुछ भाषाओं में, उदाहरण के लिए C++, Java, और Raku यह या self एक कीवर्ड है, और वेरिएबल स्वचालित रूप से इंस्टेंस विधियों में मौजूद होता है। दूसरों में, उदाहरण के लिए पायथन, रस्ट और पर्ल 5 में, इंस्टेंस विधि का पहला पैरामीटर एक ऐसा संदर्भ है। इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। पायथन और पर्ल में, पैरामीटर को आवश्यक रूप से यह या self नाम देने की आवश्यकता नहीं है; इसे किसी अन्य पैरामीटर की तरह प्रोग्रामर द्वारा स्वतंत्र रूप से नामित किया जा सकता है। हालाँकि, अनौपचारिक परंपरा के अनुसार, पर्ल या पायथन में इंस्टेंस विधि के पहले पैरामीटर को self नाम दिया गया है। जंग के लिए आवश्यक है कि सेल्फ ऑब्जेक्ट को &self या self कहा जाए, यह इस बात पर निर्भर करता है कि क्या इनवोक किया गया फ़ंक्शन इनवोकेंट को उधार लेता है, या इसे क्रमशः अंदर ले जाता है।
 
C++ या Java में स्टेटिक विधियाँ उदाहरणों से नहीं बल्कि कक्षाओं से संबद्ध हैं, और इसलिए इसका उपयोग नहीं किया जा सकता, क्योंकि कोई ऑब्जेक्ट नहीं है। अन्य भाषाओं में, जैसे रूबी, स्मॉलटॉक, ऑब्जेक्टिव-सी, या स्विफ्ट, विधि एक क्लास ऑब्जेक्ट से जुड़ी होती है जिसे इस रूप में पारित किया जाता है, और उन्हें क्लास विधियाँ कहा जाता है। क्लास विधियों के लिए, पायथन क्लास ऑब्जेक्ट तक पहुँचने के लिए cls का उपयोग करता है।
 
== सूक्ष्मताएँ और कठिनाइयाँ ==
जब इसका अनुमान लगाने के लिए लेक्सिकल स्कोपिंग का उपयोग किया जाता है, तो कोड में इसका उपयोग, हालांकि अवैध नहीं है, एक रखरखाव प्रोग्रामर के लिए चेतावनी की घंटी बजा सकता है, हालांकि इस मामले में अभी भी इसके वैध उपयोग हैं, जैसे कि स्थानीय द्वारा छिपाए गए उदाहरण चर का संदर्भ देना एक ही नाम के चर, या यदि विधि वर्तमान ऑब्जेक्ट का संदर्भ वापस करना चाहती है, यानी यह, स्वयं।
 
कुछ कंपाइलरों (उदाहरण के लिए जीसीसी) में, सी++ इंस्टेंस विधियों के पॉइंटर्स को स्पष्ट रूप से इस पॉइंटर पैरामीटर के साथ सीधे किसी अन्य प्रकार के पॉइंटर पर डाला जा सकता है।
 
'''खुला प्रत्यावर्तन'''
 
इसका प्रेषण शब्दार्थ, अर्थात् इस पर विधि कॉल गतिशील रूप से प्रेषित की जाती है, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका मतलब है कि इन विधियों को व्युत्पन्न वर्गों या वस्तुओं द्वारा ओवरराइड किया जा सकता है। इसके विपरीत, किसी फ़ंक्शन का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन __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);
}
यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष पुनरावर्तन है, इसलिए फैक्टोरियल विधि को ओवरराइड करना इस फ़ंक्शन को ओवरराइड कर देगा; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में एक विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के मामलों में उसी विधि को कॉल करती है। [4] [5]
 
नाजुक बेस क्लास समस्या को खुले रिकर्सन पर दोषी ठहराया गया है, इस सुझाव के साथ कि खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के बजाय बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए इस डिफ़ॉल्ट पर विधियों को लागू करना, केवल खुले रिकर्सन का उपयोग करना जब यह हो विशेष रूप से अनुरोध किया गया; बाहरी कॉल (इसका उपयोग नहीं करते हुए) हमेशा की तरह गतिशील रूप से भेजी जाएंगी। [6] [7] जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह एक निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम शामिल हैं:[8]
 
इस पर कोई भी कोड सार्वजनिक तरीकों का आह्वान नहीं करता है।
 
कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) एक संरक्षित या निजी विधि में समाहित किया गया है; यदि इसे सीधे उपयोगकर्ताओं के सामने उजागर करने की आवश्यकता है, तो एक रैपर सार्वजनिक विधि आंतरिक विधि को कॉल करती है।
 
शुद्ध तरीकों के लिए पिछली अनुशंसा में ढील दी जा सकती है।
 
== कार्यान्वयन ==
'''सी++'''
 
अधिक जानकारी: C++ कक्षाएं
 
C++ के प्रारंभिक संस्करण इस सूचक को बदलने देंगे; ऐसा करने से एक प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। अंततः इस सुविधा को हटा दिया गया, और अब C++ में यह एक r-मान है।[9]
 
C++ के शुरुआती संस्करणों में संदर्भ शामिल नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, तो यह एक संदर्भ होता, सूचक नहीं।[10]
 
C++ ऑब्जेक्ट को सोर्स कोड स्टेटमेंट के साथ स्वयं को नष्ट करने देता है: इसे हटाएं।
 
'''सी#'''
 
अधिक जानकारी: सी शार्प (प्रोग्रामिंग भाषा)
 
C# में यह कीवर्ड संदर्भ प्रकारों के लिए जावा की तरह ही काम करता है। हालाँकि, C# मान प्रकारों के भीतर, इसमें काफी भिन्न शब्दार्थ हैं, जो एक सामान्य परिवर्तनशील चर संदर्भ के समान है, और यहां तक कि किसी असाइनमेंट के बाईं ओर भी हो सकता है।
 
C# में इसका एक उपयोग एक विधि के भीतर एक बाहरी फ़ील्ड चर के संदर्भ की अनुमति देना है जिसमें एक स्थानीय चर होता है जिसका नाम समान होता है। ऐसी स्थिति में, उदाहरण के लिए, कथन var n = localAndFieldname; विधि के भीतर स्थानीय चर localAndFieldname का प्रकार और मान n को निर्दिष्ट किया जाएगा, जबकि कथन var n = this.localAndFieldname; बाहरी फ़ील्ड चर का प्रकार और मान n को निर्दिष्ट करेगा।
 
'''डी'''
 
डी में यह एक वर्ग, संरचना या संघ विधि में संलग्न समुच्चय के उदाहरण के एक अपरिवर्तनीय संदर्भ को संदर्भित करता है। कक्षाएं संदर्भ प्रकार हैं, संरचनाएं और यूनियन मूल्य प्रकार हैं। डी के पहले संस्करण में, कीवर्ड का उपयोग उस ऑब्जेक्ट के उदाहरण के लिए सूचक के रूप में किया जाता है जिससे विधि जुड़ी हुई है, जबकि डी 2 में इसमें एक अंतर्निहित रेफरी फ़ंक्शन तर्क का चरित्र होता है।
 
'''डायलन'''
 
प्रोग्रामिंग भाषा डायलन में, जो एक ऑब्जेक्ट-ओरिएंटेड भाषा है जो मल्टीमेथड्स का समर्थन करती है और इसकी कोई अवधारणा नहीं है, किसी ऑब्जेक्ट को संदेश भेजना अभी भी सिंटैक्स में रखा जाता है। नीचे दिए गए दोनों फॉर्म एक ही तरह से काम करते हैं; अंतर केवल वाक्यात्मक शर्करा है।
object.method(param1, param2)
और
method (object, param1, param2)
 
== '''एफिल''' ==
एक वर्ग पाठ के भीतर, वर्तमान प्रकार वर्तमान वर्ग से प्राप्त प्रकार है। किसी क्लास की सुविधाओं (रूटीन, कमांड और क्वेरीज़) के भीतर, कोई व्यक्ति वर्तमान क्लास और उसकी विशेषताओं को संदर्भित करने के लिए करंट कीवर्ड का उपयोग कर सकता है। कीवर्ड करंट का उपयोग वैकल्पिक है क्योंकि करंट कीवर्ड का तात्पर्य केवल वर्तमान वर्ग सुविधा के नाम को खुले तौर पर संदर्भित करना है। उदाहरण के लिए: किसी के पास क्लास MY_CLASS में `फू' सुविधा हो सकती है और इसे इसके द्वारा संदर्भित किया जा सकता है:
    class
      MY_CLASS
 
  feature -- Access
 
      foo: INTEGER
 
      my_function: INTEGER
        do
          Result := foo
        end
    
    
   सुविधा--पहुँच
   end
[12]
 
पंक्ति #10 (ऊपर) में सरल `फू' कॉल द्वारा करंट का निहित संदर्भ है।
 
पंक्ति #10 (नीचे) में 'Current.foo' पर कॉल द्वारा करंट का स्पष्ट संदर्भ है।
    class                                                                              MY_CLASS
 
  feature -- Access
 
      foo: INTEGER
 
      my_function: INTEGER
        do
            Result := Current.foo
        end
 
  end
कंपाइलर को कोई भी दृष्टिकोण स्वीकार्य है, लेकिन निहित संस्करण (जैसे x := foo) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।
 
अन्य भाषाओं की तरह, कई बार करंट कीवर्ड का उपयोग अनिवार्य होता है, जैसे:
    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
    
    
   my_command
   end
  -- 'वर्तमान' के साथ MY_OTHER_CLASS बनाएं
  स्थानीय
  एक्स: मेरी_अन्य_क्लास
  करना
  x.make_with_something बनाएं (वर्तमान)
  अंत
अंत
उपरोक्त कोड के मामले में, लाइन #11 पर '''मेक_विथ_समथिंग''' पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है <code>करंट</code>.
उपरोक्त कोड के मामले में, लाइन #11 पर '''मेक_विथ_समथिंग''' पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है <code>करंट</code>.


Line 136: Line 237:
* {{annotated link|प्रोग्राम खंड उपसर्ग}}
* {{annotated link|प्रोग्राम खंड उपसर्ग}}


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

Revision as of 01:04, 7 August 2023

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

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

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

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

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

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

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

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

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

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

इसका प्रेषण शब्दार्थ, अर्थात् इस पर विधि कॉल गतिशील रूप से प्रेषित की जाती है, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका मतलब है कि इन विधियों को व्युत्पन्न वर्गों या वस्तुओं द्वारा ओवरराइड किया जा सकता है। इसके विपरीत, किसी फ़ंक्शन का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन __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);
}

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

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

इस पर कोई भी कोड सार्वजनिक तरीकों का आह्वान नहीं करता है।

कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) एक संरक्षित या निजी विधि में समाहित किया गया है; यदि इसे सीधे उपयोगकर्ताओं के सामने उजागर करने की आवश्यकता है, तो एक रैपर सार्वजनिक विधि आंतरिक विधि को कॉल करती है।

शुद्ध तरीकों के लिए पिछली अनुशंसा में ढील दी जा सकती है।

कार्यान्वयन

सी++

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

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

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

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

सी#

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

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

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

डी

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

डायलन

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

object.method(param1, param2)

और

method (object, param1, param2)

एफिल

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

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

[12]

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

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

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

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

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

    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 पर मेक_विथ_समथिंग पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है करंट.

जावा

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

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

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

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

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

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

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

// 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");
    });
});

विशेष रूप से, जावास्क्रिप्ट दोनों का उपयोग करता है दिस और संबंधित कीवर्ड सेल्फ[5] (अधिकांश अन्य भाषाओं के विपरीत जो या दूसरे को नियोजित करती हैं), साथ सेल्फ विशेष रूप से वेब कर्मियों तक ही सीमित रखा जा रहा है।[6]

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

दो

लुआ में, सेल्फ जब फ़ंक्शंस का उपयोग करके परिभाषित किया जाता है तब सिंटैक्टिक शुगर के रूप में बनाया जाता है : ऑपरेटर।[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")

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

पावरशेल

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

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

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

पायथन

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

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

जंग

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

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();
    }
}

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

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

स्वयं

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

एक्सबेस++

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

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

यह भी देखें

संदर्भ

  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"

अग्रिम पठन