माणिक में वर्ग विधियाँ

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

शुरू करने के लिए, आइए परिभाषित करें: सभी वस्तुओं को रूबी में। इसे अवशोषित, अधिग्रहित और हमेशा याद रखना चाहिए। यहां तक ​​कि कक्षाएं ऐसी वस्तुएं हैं जिनका नाम एक स्थिर है। और प्रत्येक ऑब्जेक्ट के साथ, आप विधियों के लिए किसी भी कार्रवाई का धन्यवाद कर सकते हैं। इसलिए, एक उचित प्रश्न उठता है: क्या तरीकों के लिए कक्षाओं के साथ कुछ करना संभव है?

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

उदाहरण के तरीके (उदाहरण मेट्रो):

अक्सर उपयोग किया जाता है, आमतौर पर इस तरह के तरीकों के साथ, भाषा सीखना लगभग सभी पाठ्यपुस्तकों में शुरू होता है। वे आमतौर पर तीन तरीकों से बनाए जाते हैं:

#  1 class Test def foo puts ' ' end end a = Test.new a.foo # => " " #  2 class Test attr_accessor :foo end a = Test.new a.foo = ' ' puts a.foo #  3 class Test; end a = Test.new def a.foo puts ' ' end Test.new.foo # => " " 


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

क्लास के तरीके

रूबी एक बहुत ही लचीली और संक्षिप्त भाषा है, इसलिए यह हमें कक्षा पद्धतियां बनाने के लिए चार अलग-अलग तरीके प्रदान करती है:

 #  1 class Test def self.foo puts ' ' end end Test.foo # => " " #  1 class Test def Test.foo puts ' ' end end Test.foo # => " " #  3 class Test class << self def foo puts ' ' end end end Test.foo # => " " #  4 class Test; end def Test.foo puts ' ' end Test.bar # => " " 


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

यह इन विधियों का उपयोग करने के लायक कब है? आमतौर पर इनका उपयोग तब किया जाता है जब आप किसी वर्ग के अलग-अलग उदाहरणों के साथ काम नहीं कर रहे होते हैं। रेलों में सबसे आम उदाहरण सत्यापन विधि है। कोड कुछ इस तरह दिखता है:

 module ActiveRecord class Base def self.validates_of(...) #   end end end class Foo < ActiveRecord::Base validates_of :bar #       end 


इस उदाहरण में arrt_* परिवार की सभी विधियाँ भी शामिल हैं। एक अद्भुत new विधि भी है जिसमें Class वर्ग के सभी उदाहरण हैं।

आपस में उदाहरण और वर्ग के तरीकों की बातचीत।

ऐसे समय होते हैं जब आपको क्लास विधि में एक इंस्टेंस विधि को कॉल करने की आवश्यकता होती है, रूबी इसके लिए एक सुरुचिपूर्ण तरीका प्रदान करती है:

 #  instance   class . class Test def instance_method #   end def self.class_method a = Test.new a.instance_method end end 


और कभी-कभी ऐसे मामले भी होते हैं जब इसके विपरीत, आपको उदाहरण विधि में वर्ग विधि को कॉल करने की आवश्यकता होती है। इन उद्देश्यों के लिए, आपको class विधि का उपयोग करने की आवश्यकता है:

 #  class   instance . class Test def self.class_method puts self end def instance_method self.class.class_method end end 


यह समझना महत्वपूर्ण है कि self एक विशेष वर्ग के मूल्य को वापस करता है, इसलिए कभी-कभी भ्रम तब होता है जब यह आवश्यक होता है कि इस तरह के वर्ग के उत्तराधिकारी मूल विधि को वापस कर दें। इन उद्देश्यों के लिए, self बजाय self सीधे माता-पिता के वर्ग नाम का उपयोग करें:

 class Test1 def self.class_method "foo" end def make1 self.class.class_method end def make2 Test1.class_method end end class Test2 < Test1 def self.class_method "abc" end end b = Test2.new b.make1 # => "abc" b.make2 # => "foo" 


पुनश्च: अंतिम उदाहरण में त्रुटि को खोजने में मदद करने के लिए साथी वॉकमेन 7 के लिए धन्यवाद।

Source: https://habr.com/ru/post/In176763/


All Articles