Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

विकिपीडिया के अनुसार, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) "ऑब्जेक्ट्स" की अवधारणा पर आधारित एक प्रोग्रामिंग प्रतिमान है, जिसमें डेटा और कोड शामिल हो सकते हैं:डेटा फ़ील्ड के रूप में (अक्सर विशेषताओं या गुणों के रूप में जाना जाता है) और फॉर्म में कोड प्रक्रियाओं की (अक्सर विधियों के रूप में जाना जाता है)।

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

रूबी object_id . नामक एक विधि प्रदान करती है , जो सभी वस्तुओं के लिए उपलब्ध है। यह पहचानकर्ता एक पूर्णांक देता है और किसी भी दो वस्तुओं के लिए समान नहीं होता है। आइए अपने हाथों को गंदा करने के लिए आईआरबी में शामिल हों; आप irb . लिखकर ऐसा कर सकते हैं आपके टर्मिनल में।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर देखा गया है, तार, पूर्णांक, सरणियाँ, वर्ग और यहां तक ​​कि विधियाँ सभी ऑब्जेक्ट हैं, क्योंकि उनके पास एक ऑब्जेक्ट आईडी है।

इस लेख में, हम निम्नलिखित अवधारणाओं को विस्तार से कवर करेंगे:

  • कक्षाएं और उदाहरण
  • विरासत
  • सार्वजनिक, निजी और संरक्षित तरीके
  • मिश्रण
  • मॉड्यूल
  • वस्तु पदानुक्रम

कक्षाएं और उदाहरण

रूबी में, वर्ग वे होते हैं जहाँ किसी वस्तु के गुण और व्यवहार (क्रियाएँ) परिभाषित होते हैं। यदि कोई वस्तु गोल (एक विशेषता) है और बोलने में सक्षम होना चाहिए (एक क्रिया), तो हम उस वर्ग से बता सकते हैं, क्योंकि इन विशेषताओं और क्रियाओं को विधियों नामक किसी चीज़ के रूप में परिभाषित किया गया है उस वर्ग में। किसी वर्ग से संबंधित वस्तु को उदाहरण . कहा जाता है उस वर्ग का और .new . का उपयोग करके बनाया (तत्काल) बनाया गया है . आइए Human . नामक एक वर्ग बनाकर प्रारंभ करें . मुझे लगता है कि हम सभी इंसान हैं, इसलिए यह मजेदार होना चाहिए।

class Human
  def initialize(name)
    @name = name
  end
end

आरंभ करें विधि एक वर्ग के एक नए उदाहरण के निर्माण के लिए आवश्यकताओं की पहचान करती है। उपरोक्त मामले में, हम देख सकते हैं कि एक नया मानव बनाने के लिए, एक नाम की आवश्यकता होती है। इसलिए, Human.new(name) . कमांड का उपयोग करके मानव का एक नया उदाहरण बनाया जा सकता है , जहां नाम आप जो भी चुनते हैं। हमारे मामले में, आइए 'हेनरी' का प्रयोग करें। हमारे irb वातावरण में इसका परीक्षण करने के लिए, हमें केवल load './path_to_filename' कमांड का उपयोग करके फ़ाइल को लोड करना है। और जब भी परिवर्तन किए जाते हैं तो फ़ाइल पुन:निष्पादन के लिए कमांड का पुन:उपयोग करें। मेरे मामले में, यह load './Human.rb' . है क्योंकि आईआरबी उक्त फाइल वाले फोल्डर में ओपन होता है। आईआरबी के बिना कोड चलाने के लिए, हमें एक puts जोड़ना होगा प्रत्येक आदेश से पहले बयान ताकि परिणाम दिखाई दे।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जब हम एक नाम के बिना एक नया मानव बनाने की कोशिश करते हैं, तो हमें एक तर्क त्रुटि मिलती है क्योंकि एक नाम की आवश्यकता होती है। हालांकि, जब हम इसे सही तरीके से करते हैं, तो हम देखते हैं कि हेनरी नाम का मानव बनाया गया है और वह Human वर्ग से संबंधित है। . इसलिए हेनरी वर्ग Human . का एक उदाहरण है ।

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

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

def name
  @name
end

def no_of_legs
  2
end

def no_of_hands
  2
end

def speak
  'blablabla'
end

हमने ऐसे तरीके जोड़े हैं जो बनाए गए मानव के नाम को पुनः प्राप्त करते हैं, मानव के पैरों और हाथों की संख्या को परिभाषित करते हैं, और मानव को बोलने की क्षमता देते हैं। हम इन विधियों को instance.method_name . का उपयोग करके क्लास इंस्टेंस पर कॉल कर सकते हैं , जैसा कि नीचे दिखाया गया है।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

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

def name=(new_name)
  @name = new_name
end

रूबी के अंतर्निर्मित attr_accessor का उपयोग करना विधि, हम अपनी नाम विधि को त्याग सकते हैं और इसे attr_accessor :name लाइन से बदल सकते हैं :

class Human
  attr_accessor :name

  def initialize(name)
    @name = name
  end
# rest of the code
end

चुने हुए तरीके के बावजूद, दिन के अंत में, यही उपलब्ध है।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

अब तक बनाए गए सभी तरीकों को instance methods . कहा जाता है क्योंकि उन्हें कक्षा के किसी भी उदाहरण पर बुलाया जा सकता है लेकिन कक्षा में ही नहीं। class method . नाम की कोई चीज़ भी होती है , जिसे कक्षा पर ही बुलाया जा सकता है, न कि इसके उदाहरणों पर। क्लास मेथड्स को मेथड नाम को self. . के साथ प्रीफ़िक्स करके नाम दिया गया है . यहां एक उदाहरण दिया गया है:

# within the Human class
def self.introduction
  "I am a human, not an alien!"
end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि हम ऊपर देख सकते हैं, क्लास मेथड केवल क्लास के लिए ही उपलब्ध है, न कि इसके इंस्टेंस के लिए। इसके अलावा, जैसे उदाहरण चर मौजूद हैं, हमारे पास वर्ग चर हैं, जो दो @ . के साथ उपसर्ग करते हैं प्रतीक एक उदाहरण नीचे दिखाया गया है।

class Human
  attr_accessor :name
  @@no_cars_bought = 0 #class variable

  def initialize(name)
    @name = name
  end

  def self.no_cars_bought
    @@no_cars_bought
  end

  def buy_car
    @@no_of_cars_bought += 1
    "#{@name} just purchased a car"
  end
end

इस उदाहरण में, हमने एक buy_car जोड़ा है हर इंसान को कार खरीदने में सक्षम बनाने की विधि। हमने @@no_of_cars_bought . नामक एक वर्ग चर भी बनाया है जो हर बार कार खरीदने पर 1 बढ़ जाती है। अंत में, हमने no_cars_bought . नामक एक वर्ग विधि बनाई जो खरीदी गई कारों की संख्या प्राप्त करता है। आइए देखें कि यह कैसे काम करता है:

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

अब तक परिभाषित सभी विधियों को सार्वजनिक . के रूप में जाना जाता है विधियाँ क्योंकि वे कक्षा के बाहर पहुँच योग्य हैं। हम निजी . नामक विधियों को भी परिभाषित कर सकते हैं विधियाँ, जिन्हें केवल एक वर्ग के भीतर पहुँचा जा सकता है। आइए एक उदाहरण देखें।

# at the bottom of the Human class
  def say_account_number
    "My account number is #{account_number}"
  end

  private

  def account_number
    "1234567890"
  end

यह निम्नलिखित देता है:

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जब हम henry.account_number . पर कॉल करते हैं , हमें "NoMethodError" मिलता है क्योंकि account_number एक निजी विधि है जिसे केवल कक्षा के भीतर से ही पहुँचा जा सकता है। say_account_number . के द्वारा एक्सेस किए जाने पर जैसा कि हमने किया था, कोई त्रुटि नहीं है, क्योंकि यह विधि उसी वर्ग के भीतर मौजूद है जिसमें निजी विधि है। यह ध्यान रखना महत्वपूर्ण है कि private . के बाद प्रत्येक इंस्टेंस विधि कीवर्ड एक निजी विधि बन जाता है; इसलिए, सभी सार्वजनिक विधियों के बाद निजी विधियों को कक्षा में सबसे नीचे परिभाषित किया जाना चाहिए।

क्या आपने कभी संरक्षित . के बारे में सुना है तरीके? हाँ सही! ये भी मौजूद हैं, लेकिन विरासत . की अवधारणा को समझने के बाद हम इनके बारे में बात करेंगे ।

विरासत

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

class Mammal
  def has_hair?
    "Most certainly, Yes"
  end

  def has_complex_brain?
    "Well, as a mammal, what do you expect?"
  end
end

क्या आपको मेरा विज्ञान वर्ग का वाक्यांश याद है? यदि हां, तो यह महत्वपूर्ण है कि हम एक ऐसा संबंध बनाएं जो इस कथन की पुष्टि करता हो। तो हम क्या करें? हम मानव वर्ग को Mammal . के गुणों को विरासत में लेने की अनुमति देते हैं < Mammal . जोड़कर कक्षा इसकी कक्षा परिभाषा के लिए।

class Human < Mammal
  # all other code
end

एक वर्ग जो दूसरे के गुणों को विरासत में प्राप्त कर रहा है, उसे उपवर्ग . कहा जाता है , और जिस वर्ग से इसे विरासत में मिला है उसे सुपरक्लास . कहा जाता है . हमारे मामले में, Human उपवर्ग है और Mammal सुपरक्लास है। इस बिंदु पर यह ध्यान रखना महत्वपूर्ण है कि यदि आप सभी वर्गों को एक फ़ाइल में परिभाषित कर रहे हैं जैसे हम अभी कर रहे हैं, Mammal वर्ग की परिभाषा Human . से पहले आनी चाहिए आपकी फ़ाइल में वर्ग, क्योंकि हम परिभाषित होने से पहले एक चर का उल्लेख नहीं करना चाहते हैं। आइए देखें कि मानव के पास अब कौन-सी अतिरिक्त विशेषताएं हैं।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, मानव के पास अब Mammal . में परिभाषित सभी विशेषताओं तक पहुंच है कक्षा। अगर हम इनहेरिटेंस हटाते हैं (यानी, हम < Mammal . हटाते हैं कोड की उस पंक्ति से) और कमांड चलाएँ henry.class.superclass , हमें हमारी प्रतिक्रिया के रूप में "ऑब्जेक्ट" मिलता है। यह हमें बताता है कि प्रत्येक वर्ग जब सीधे किसी अन्य वर्ग से विरासत में नहीं मिलता है, तो उसका सुपरक्लास "ऑब्जेक्ट" होता है, जो इस तथ्य को और मजबूत करता है कि रूबी में, यहां तक ​​​​कि कक्षाएं भी वस्तुएं हैं।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

अब जब हम जानते हैं कि सुपरक्लास क्या हैं, तो यह कीवर्ड सुपर के बारे में बात करने का सही समय है। . रूबी इस कीवर्ड को सुपरक्लास पर पहले से मौजूद विधियों के पुन:उपयोग और संशोधन को सक्षम करने के लिए प्रदान करता है। हमारे Mammal . में सुपरक्लास, याद रखें कि हमारे पास has_hair? . नामक एक विधि है; क्या होगा यदि हम उस विधि को बुलाए जाने पर मनुष्यों के लिए विशिष्ट अतिरिक्त जानकारी जोड़ना चाहते हैं? यहीं पर सुपर कीवर्ड का उपयोग आता है। हमारे Human . में वर्ग, हम एक ही नाम के साथ एक विधि परिभाषित करते हैं, has_hair?

def has_hair?
  super + ", but humans can be bald at times"
end

जब सुपर कीवर्ड कहा जाता है, रूबी सुपरक्लास में उस विधि के नाम की तलाश करती है और उसका परिणाम देती है। उपरोक्त विधि में, हमने सुपरक्लास' has_hair? द्वारा उत्पादित परिणाम में कुछ अतिरिक्त जानकारी जोड़ी है। विधि।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

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

संरक्षित तरीके

संरक्षित विधियाँ निजी विधियों की तरह कार्य करती हैं, जिसमें वे एक वर्ग और उसके उपवर्गों में बुलाए जाने के लिए उपलब्ध हैं। आइए Mammal . के भीतर एक संरक्षित विधि बनाएं कक्षा।

  #at the bottom of the Mammal class
  def body_status
    body
  end

  protected
  def body
    "This body is protected"
  end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, हम body . तक नहीं पहुंच सकते हैं विधि क्योंकि यह संरक्षित है। हालांकि, हम इसे body_status . से एक्सेस कर सकते हैं विधि, जो Mammal . के अंदर एक अन्य विधि है कक्षा। हम उस वर्ग के उपवर्गों से संरक्षित विधियों तक भी पहुँच सकते हैं जहाँ इसे परिभाषित किया गया है। आइए इसे Human . में आजमाएं कक्षा।

# within the Human class
def check_body_status
  "Just a human checking that " + body.downcase
end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, इस बात की परवाह किए बिना कि Human . के भीतर बॉडी मेथड को परिभाषित किया गया है या नहीं वर्ग और संरक्षित, Human वर्ग इसे एक्सेस कर सकता है क्योंकि यह Mammal . का एक उपवर्ग है कक्षा। निजी तरीकों से भी यह उपवर्ग पहुंच संभव है; हालांकि, इससे यह सवाल पैदा होता है कि इन तरीकों में क्या अंतर है।

स्पष्ट रिसीवर का उपयोग करके संरक्षित विधियों को कॉल किया जा सकता है, जैसा कि receiver.protected_method में है , जब तक विचाराधीन प्राप्तकर्ता कीवर्ड self . है या उसी कक्षा में self . हालाँकि, निजी विधियों को केवल स्पष्ट रिसीवर का उपयोग करके ही कहा जा सकता है जब स्पष्ट रिसीवर self . हो .आइए body.downcase . को बदलकर अपना कोड संपादित करें self.body.downcase . के साथ check_body_status . में विधि और हमारी निजी विधि कॉल को बदलने के लिए self . भी शामिल है ।

def check_body_status
  "Just a human checking that " + self.body.downcase
  # body method is protected
end

def say_account_number
  "My account number is #{self.account_number}"
  # account_number method is private
end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

पुनश्च:रूबी 2.7 . से पहले , self . का उपयोग करके, कुछ जानकारी प्राप्त करने के लिए किसी निजी विधि को कॉल करते समय असंभव था।

आइए आगे बढ़ते हैं और self . शब्द को प्रतिस्थापित करते हैं self . के समान वर्ग में किसी ऑब्जेक्ट के साथ . हमारे मामले में, self Henry है , विधियों को कौन बुला रहा है, और Henry Human . का एक उदाहरण है वर्ग, जो Mammal . से विरासत में मिला है कक्षा।

def check_body_status
  non_self = Human.new('NotSelf') #same class as self
  puts "Just #{non_self.name} checking that " + non_self.body.downcase
  # Mammal.new is also in the same class as self
  "Just a human checking that " + Mammal.new.body.downcase
end

def say_account_number
  non_self = Human.new('NotSelf')
  "My account number is #{non_self.account_number}"
end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, self . को बदलना संभव है self . के समान वर्ग के ऑब्जेक्ट के साथ संरक्षित विधियों में , लेकिन निजी तरीकों से यह असंभव है।

मिश्रण

मिक्सिन मॉड्यूल . में परिभाषित कोड का एक सेट है , जो, जब किसी वर्ग में शामिल या विस्तारित किया जाता है, तो उस वर्ग को अतिरिक्त क्षमताएं प्रदान करता है। एक वर्ग में कई मॉड्यूल जोड़े जा सकते हैं, क्योंकि इसकी कोई सीमा नहीं है, इसके विपरीत जो वर्ग वंशानुक्रम में प्राप्य है। इस जानकारी के आलोक में, आइए एक मॉड्यूल बनाएं जिसे Movement . कहा जाता है मानव वर्ग में चलने की क्षमता जोड़ने के लिए।

module Movement
  def hop
    "I can hop"
  end

  def swim
    "Ermmmm, I most likely can if I choose"
  end
end

अगला कदम इस मॉड्यूल को हमारे Human . में शामिल करना होगा कक्षा। यह वाक्यांश जोड़कर किया जाता है include <module_name> प्रश्न में वर्ग के लिए। हमारे मामले में, इसमें include Movement . जोड़ना होगा मानव वर्ग के लिए, जैसा कि नीचे दिखाया गया है।

class Human < Mammal
  include Movement
  # rest of the code
end

आइए इस कोड का परीक्षण करें:

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, मॉड्यूल के माध्यम से कक्षा में मिश्रित विधियाँ केवल वर्ग के उदाहरणों के लिए उपलब्ध हैं, न कि स्वयं वर्ग के लिए। क्या होगा यदि हम मॉड्यूल में विधियों को कक्षा में उपलब्ध कराना चाहते हैं, उदाहरण के लिए नहीं? ऐसा करने के लिए, हम "शामिल करें" शब्द को "विस्तार" से बदल देते हैं, जैसा कि extend Movement में है। ।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

.extend शब्द का उपयोग वर्ग के उदाहरणों पर भी किया जा सकता है लेकिन बहुत अलग तरीके से। आइए एक और मॉड्यूल बनाएं जिसे Parent . कहा जाता है ।

module Parent
  def has_kids?
    "most definitely"
  end
end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, .extend(Parent) . का उपयोग करके डैड वैरिएबल पर has_kids? . बनाता है इसके लिए उपलब्ध विधि। यह विशेष रूप से तब उपयोगी होता है जब हम मॉड्यूल के तरीकों को हर वर्ग के उदाहरण में मिश्रित नहीं करना चाहते हैं। इस प्रकार, extend केवल उस विशेष उदाहरण पर उपयोग किया जा सकता है जिसमें हम रुचि रखते हैं।

मॉड्यूल

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

module Male
  AGE = "Above 0"

  class Adult
    def initialize
      puts "I am an adult male"
    end
  end

  def self.hungry
    puts "There's no such thing as male food, I just eat."
  end

  module Grown
    def self.age
      puts "18 and above"
    end
  end
end

आपने देखा होगा कि ऊपर दिए गए मॉड्यूल में परिभाषित और बुलाए गए तरीके self. . से पहले लगे होते हैं . ऐसा इसलिए है क्योंकि मॉड्यूल को तत्काल नहीं किया जा सकता है, और उनके भीतर परिभाषित कोई भी विधि self. . के बिना उपसर्ग केवल एक मिश्रण के रूप में उपलब्ध होगा, जैसा कि हमने पहले देखा था जब हमने mixins . पर चर्चा की थी . मॉड्यूल पर ही किसी विधि को कॉल करने के लिए, हमें इसे self.method_name के उपयोग के माध्यम से विधि नाम पर पहचानना होगा . याद रखें कि हमने self . का भी उपयोग किया था कक्षा विधियों में कीवर्ड; वही सिद्धांत यहां लागू होता है।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, मॉड्यूल के भीतर परिभाषित कक्षाओं, मॉड्यूल या स्थिरांक तक पहुंचने के लिए, हम module_name::target_name का उपयोग करते हैं . नेमस्पेसिंग अवधारणा को ठीक से समझने के लिए, हम Adult . नामक एक वर्ग के साथ एक और मॉड्यूल बनाएंगे , और फिर हम देखेंगे कि कैसे दोनों वर्गों में अंतर है।

module Female
  class Adult
    def initialize
      puts "I am an adult female"
    end
  end
    def self.hungry
      puts "Maybe there's such a thing as female food, I'm not sure. I just need to eat"
    end
end

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

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

ऑब्जेक्ट पदानुक्रम

कक्षाओं, उदाहरणों, मॉड्यूल और विरासत की अवधारणा को समझना आश्चर्यजनक है, लेकिन रूबी में वस्तु पदानुक्रम को समझे बिना इस क्षेत्र में ज्ञान अधूरा है। यह उस क्रम को संदर्भित करता है जिसमें रूबी में एक विधि की खोज की जाती है। इस पदानुक्रम को समझने में हमारी सहायता के लिए कुछ विधियां मौजूद हैं; उनमें से एक है ancestors तरीका। यह विधि वर्ग के उदाहरणों के लिए उपलब्ध नहीं है, लेकिन इसे स्वयं और उनके पूर्वजों की कक्षाओं में बुलाया जा सकता है। एक उदाहरण नीचे दिखाया गया है।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

Human.ancestors . के परिणाम से , हम देखते हैं कि यह विधि प्रश्न में वर्ग को लौटाती है, इसके सीधे शामिल मॉड्यूल, इसके मूल वर्ग, और माता-पिता की कक्षा 'सीधे शामिल मॉड्यूल; यह लूप तब तक जारी रहता है जब तक कि यह Basic Object तक नहीं पहुंच जाता , जो सभी वस्तुओं का मूल है।

किसी वर्ग के बारे में अधिक जानकारी प्राप्त करने के लिए एक अन्य उपलब्ध विधि है included_modules

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, मानव वर्ग में दो मॉड्यूल शामिल हैं:एक जिसे हमने सीधे include Movement का उपयोग करके शामिल किया है और वह जो ऑब्जेक्ट क्लास में शामिल है। इसका मतलब यह है कि प्रत्येक वर्ग को अपने पूर्वज वर्गों से वर्ग गुण विरासत में मिलते हैं, और उनमें शामिल प्रत्येक मॉड्यूल इसमें शामिल हो जाता है। इस जानकारी के आधार पर, हम रूबी में विधि लुकअप पथ की पुष्टि करने के लिए एक सरल अभ्यास करेंगे और किन वर्गों की प्राथमिकताएँ हैं इस रास्ते में दूसरों पर। हम एक ही नाम लेकिन अलग आउटपुट स्ट्रिंग के साथ विधियों को परिभाषित करेंगे और उन्हें Human . में रखेंगे वर्ग, Movement मॉड्यूल, और Mammal कक्षा।

# in the mammal class
def find_path
  "Found me in the Mammal class path"
end

# in the Movement module
def find_path
  "Found me in the Movement module path"
end
# in the Human class
def find_path
  "Found me in the Human class path"
end

अब इस अभ्यास को करते हैं।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, जब हम .ancestors . को कॉल करते हैं तो पूर्वजों का क्रम निर्धारित किया जाता है उस वर्ग के उदाहरण पर बुलाए गए विधि की तलाश करते समय कक्षा पर पथ का पालन किया जाता है। Human . के लिए हमारे द्वारा बनाया गया वर्ग उदाहरण, रूबी पहले कक्षा में ही विधि की खोज करता है; यदि नहीं मिला, तो यह किसी भी सीधे शामिल मॉड्यूल के लिए आगे बढ़ता है; यदि नहीं मिला, तो यह सुपरक्लास में चला जाता है और यह चक्र तब तक जारी रहता है जब तक कि यह BasicObject तक नहीं पहुंच जाता . यदि विधि अभी भी वहां नहीं मिली है, तो "NoMethodError" वापस कर दिया जाता है। .ancestors . का उपयोग करके विधि, हम किसी ऑब्जेक्ट के लिए लुकअप पथ की पहचान कर सकते हैं और जहां इसकी विधियां किसी भी समय से निकलती हैं।

रूबी methods . नामक एक विधि भी प्रदान करती है जिससे हम किसी भी वस्तु के लिए उपलब्ध सभी विधियों की पहचान कर सकते हैं। हम यह दिखाने के लिए घटाव भी कर सकते हैं कि कौन सा इसके मूल से आता है और जो इसके लिए विशिष्ट है। एक उदाहरण नीचे दिखाया गया है।

रूबी ऑब्जेक्ट मॉडल को गहराई से समझना

जैसा कि ऊपर दिखाया गया है, चर हेनरी इसके लिए बहुत सारे तरीके उपलब्ध हैं। हालांकि, जब हम उन्हें ऑब्जेक्ट . में उपलब्ध लोगों से घटाते हैं वर्ग, हम पाते हैं कि हमारे पास केवल वही बचे हैं जिन्हें हमने अपनी फ़ाइल में विशेष रूप से परिभाषित किया है, और हर दूसरी विधि विरासत में मिली है। यह प्रत्येक वस्तु, उसके वर्ग और उसके पूर्वजों में से किसी के लिए समान है। Human.methods . से जुड़े कई संयोजनों को आज़माकर अपने हाथों को गंदा करने के लिए स्वतंत्र महसूस करें , स्तनपायी तरीके , Module.methods , और हर दूसरे वर्ग या मॉड्यूल को पहले परिभाषित किया गया है; आप पाएंगे कि यह आपको रूबी ऑब्जेक्ट मॉडल की एक मजबूत समझ देता है।


  1. रूबी में डुप बनाम क्लोन:अंतर को समझना

    क्या आप जानते हैं कि आप रूबी में किसी वस्तु की प्रतिलिपि बना सकते हैं? इतना ही नहीं, ऐसा करने के दो अलग-अलग तरीके हैं! ये विधियां हैं : dup clone हम एक पल में मतभेदों का पता लगाएंगे, लेकिन पहले… आप किसी वस्तु का क्लोन क्यों बनाना चाहते हैं ? रूबी में कई वस्तुएं परिवर्तनशील हैं, आप उन्हें बदल

  1. रूबी में डेकोरेटर डिजाइन पैटर्न

    डेकोरेटर डिजाइन पैटर्न क्या है? और आप अपने रूबी प्रोजेक्ट्स में इस पैटर्न का उपयोग कैसे कर सकते हैं? डेकोरेटर डिज़ाइन पैटर्न नई क्षमताओं . जोड़कर किसी ऑब्जेक्ट को बेहतर बनाने में आपकी सहायता करता है इसमें बिना कक्षा बदले। आइए एक उदाहरण देखें! लॉगिंग और प्रदर्शन इस उदाहरण में हम रेस्ट-क्लाइंट जैस

  1. रूबी फ्रीज विधि - वस्तु परिवर्तनशीलता को समझना

    किसी वस्तु के परिवर्तनशील होने का क्या अर्थ है? फैंसी शब्दों को भ्रमित न होने दें, “परिवर्तनशीलता ” का सीधा सा मतलब है कि किसी वस्तु की आंतरिक स्थिति को बदला जा सकता है। जमे हुए . को छोड़कर, यह सभी वस्तुओं का डिफ़ॉल्ट है , या वे जो विशेष वस्तुओं की सूची का हिस्सा हैं। दूसरे शब्दों में, रूबी में सभ