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

रूबी में विरासत में मिली हुक विधि - और अधिक पेरेंटिंग पाठ

नमस्कार बच्चों और माता-पिता, अहम रूबीस्ट्स। पहले के एक लेख में, हम पूर्वजों की श्रृंखला में प्रवेश करते हैं। आज की पोस्ट में, हम पेरेंटिंग और इनहेरिटेंस के बारे में गहराई से जानेंगे। हम इनहेरिट की गई हुक विधि का पता लगाएंगे और इनहेरिटेंस को रोकने पर विचार करेंगे।

जब किड्स इनहेरिट 101:द इनहेरिटेड हुक मेथड

आइए देखें कि पितृत्व कैसे घोषित किया जाता है। रूबी एक वर्ग के साथ बातचीत करने का एक साफ-सुथरा तरीका प्रदान करती है जब इसे किसी अन्य वर्ग के माता-पिता के रूप में घोषित किया जाता है।

class Parent
  def self.inherited(subclass)
    puts "#{subclass} inherits from Parent"
  end
end
 
class Child < Parent
end

इस कोड को चलाने से Parent.inherited के रूप में "माता-पिता से विरासत में मिला बच्चा" प्रिंट हो जाता है विधि को तब कहा जाता है जब Child वर्ग Parent . से विरासत में मिला है . ध्यान दें कि यह विधि उपवर्ग को पैरामीटर के रूप में लेती है—Child , हमारे मामले में। यह तंत्र आपको व्यवहार के एक सेट को परिभाषित करने के लिए माता-पिता वर्ग के साथ बातचीत करने की अनुमति देता है, अगर यह विरासत में मिला है। व्यवहार से, इस संदर्भ में, हमारा मतलब है कि इनहेरिट करने वाले या इनहेरिट किए गए वर्ग पर चर, विधियों और स्थिरांक को संशोधित करना, परिभाषित करना या हटाना।

अब, parent_name को परिभाषित करते हैं मक्खी पर विधि:

class Parent
  def self.inherited(subclass)
    subclass.define_method :parent_name do
      "Daddy"
    end
  end
end
 
class Child < Parent
end
 
Child.new.parent_name # => "Daddy"

यहां, हम Child . पर एक विधि परिभाषित करते हैं वर्ग जब यह Parent . से विरासत में मिलता है वर्ग, लेकिन उस विधि को सीधे Parent . में जोड़े बिना कक्षा। इसके बजाय, इसे केवल तभी परिभाषित किया जाता है जब कोई अन्य वर्ग Parent . से विरासत में मिलता है ।

ठीक है, हमने सिद्धांत को कवर कर लिया है, अब आइए एक रूबीवादी के जीवन में एक अधिक यथार्थवादी उदाहरण देखें।

वर्ग वंशानुक्रम रोकें

रूबी ऑन रेल्स में, डेटाबेस माइग्रेशन को ActiveRecord::Migration द्वारा नियंत्रित किया जाता है कक्षा। आइए इस वर्ग से सीधे इनहेरिट करने का प्रयास करें।

class AddFirstnameToUsers < ActiveRecord::Migration
end
 
# => StandardError (Directly inheriting from ActiveRecord::Migration is not supported..)

यह त्रुटि इसलिए उठाई जाती है क्योंकि रूबी ऑन रेल्स एक ऐसा तंत्र प्रदान करता है जो हमें इस वर्ग से विरासत में मिलने से रोकता है। तो रूबी ऑन रेल्स ने इस तंत्र को क्यों लागू किया?

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

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

ऊपर के उदाहरण में, हमारा माइग्रेशन ActiveRecord::Migration . से जुड़ा है रेल पर रूबी के संस्करण 4.2 के साथ एपीआई प्रदान किया गया। इसलिए, भले ही हम अपने एप्लिकेशन को संस्करण 5.0 में अपग्रेड करें, फिर भी हमारे माइग्रेशन सुचारू रूप से चलेंगे क्योंकि वे अभी भी ActiveRecord::Migration के संस्करण 4.2 के साथ चलेंगे। एपीआई।

विरासत की रोकथाम कैसे काम करती है

अब जब हम समझ गए हैं क्यों विरासत को यहां रोका गया है, आइए देखें कैसे यह ActiveRecord::Migration विरासत को रोकता है। सभी तर्क ActiveRecord::Migration.inherited . में परिभाषित हैं विधि।

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

जब हमारा AddFirstnameToUsers वर्ग ActiveRecord::Migration . से इनहेरिट करता है , ActiveRecord::Migration.inherited हुक विधि कहलाती है।

module ActiveRecord
  class Migration
    def self.inherited(subclass) #:nodoc:
      super
      if subclass.superclass == Migration
        raise StandardError, "Directly inheriting from ActiveRecord::Migration is not supported. " \
          "Please specify the Rails release the migration was written for:\n" \
          "\n" \
          "  class #{subclass} < ActiveRecord::Migration[4.2]"
      end
    end
  end
end

जैसा कि हम देख सकते हैं, यह हुक विधि जाँचती है कि क्या उपवर्ग (AddFirstnameToUsers ) सीधे ActiveRecord::Migration . से इनहेरिट करता है . यदि ऐसा होता है, तो एक त्रुटि उठाई जाती है। विरासत को नियंत्रित करने के लिए यह सही प्रवेश बिंदु है।

निष्कर्ष

आज, हमने वंशानुक्रम की मूल बातें और वंशानुक्रम को रोकना शामिल किया है। हमने इनहेरिट की गई हुक मेथड को कवर किया और देखा कि इनहेरिटिंग/इनहेरिट की गई क्लास ऑन-द-फ्लाई के साथ इंटरैक्ट करते समय यह कैसे बहुत आसान हो सकता है।

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

Et Voilà, यह आज की हमारी पोस्ट को समाप्त करता है!


  1. रूबी ग्रेप विधि का उपयोग कैसे करें (उदाहरण के साथ)

    आइए बात करते हैं grep . के बारे में विधि। यह विधि आपके लिए क्या कर सकती है? आप ग्रेप का उपयोग एरेज़ और रेंज जैसी असंख्य वस्तुओं को फ़िल्टर करने के लिए कर सकते हैं। “लेकिन चुनें पहले से ही ऐसा करता है!” हां, लेकिन grep एक अलग तरीके से काम करता है और यह अलग परिणाम देता है। आइए कुछ उदाहरण देखें।

  1. रूबी मानचित्र विधि का उपयोग कैसे करें (उदाहरण के साथ)

    मैप एक रूबी विधि है जिसका उपयोग आप ऐरे, हैश और रेंज के साथ कर सकते हैं। मानचित्र का मुख्य उपयोग डेटा को ट्रांसफ़ॉर्म करना है। उदाहरण के लिए : स्ट्रिंग्स की एक सरणी को देखते हुए, आप प्रत्येक स्ट्रिंग पर जा सकते हैं और प्रत्येक वर्ण को अपरकेस बना सकते हैं। या यदि आपके पास User . की सूची है ऑब्जेक्

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

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