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

Ruby के Inherited Hook Method में महारत: डेवलपर्स के लिए उन्नत टिप्स

नमस्ते बच्चों और माता-पिता, अहम Rubyists। एक पहले के लेख में, हम ancestry chain में गोता लगाए थे। आज के पोस्ट में, हम parenting और inheritance में गहराई से गोता लगाएंगे। हम inherited hook method का पता लगाएंगे और विरासत को रोकने में देखेंगे।

जब बच्चे विरासत में पाते हैं 101: The Inherited Hook Method

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

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

class Child < Parent
end

यह कोड "Child inherits from Parent" प्रिंट करता है, क्योंकि जब Child क्लास Parent से विरासत में लेती है तो Parent.inherited विधि को कॉल किया जाता है। ध्यान दें कि यह विधि सबक्लास को पैरामीटर के रूप में लेती है—हमारे मामले में 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 से विरासत में लेती है।

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

क्लास विरासत को रोकना

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

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

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

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

class AddFirstnameToUsers < ActiveRecord::Migration[4.2]
end

उपरोक्त उदाहरण में, हमारा माइग्रेशन Ruby on Rails के संस्करण 4.2 के साथ प्रदान किए गए ActiveRecord::Migration API से जुड़ा हुआ है। इसलिए, भले ही हम अपने एप्लिकेशन को संस्करण 5.0 में अपग्रेड करें, हमारे माइग्रेशन अभी भी सुचारू रूप से चलेंगे क्योंकि वे अभी भी ActiveRecord::Migration API के संस्करण 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

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

निष्कर्ष

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

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

एट वोइला, यह आज के लिए हमारी पोस्ट का समापन करता है!

  1. Ruby के grep मेथड में महारत: कोड उदाहरणों के साथ एक व्यावहारिक गाइड Ruby के grep मेथड में महारत: कोड उदाहरणों के साथ एक व्यावहारिक गाइड

    आइए grep मेथड के बारे में बात करते हैं। यह मेथड आपके लिए क्या कर सकता है? आप enumerable ऑब्जेक्ट्स को फ़िल्टर करने के लिए Grep का उपयोग कर सकते हैं, जैसे Arrays और Ranges। "लेकिन select पहले से ही ऐसा करता है!" हाँ, लेकिन grep अलग तरीके से काम करता है और अलग परिणाम उत्पन्न करता है। आइए कुछ

  1. Ruby के Map मेथड में महारत: उदाहरणों के साथ एक व्यावहारिक गाइड Ruby के Map मेथड में महारत: उदाहरणों के साथ एक व्यावहारिक गाइड

    Map एक Ruby मेथड है जिसका उपयोग आप Arrays, Hashes और Ranges के साथ कर सकते हैं। map का मुख्य उपयोग डेटा को ट्रांसफॉर्म करना है। उदाहरण के लिए: स्ट्रिंग्स की एक सरणी दिए जाने पर, आप हर स्ट्रिंग पर जा सकते हैं और हर कैरेक्टर को UPPERCASE बना सकते हैं। या यदि आपके पास User ऑब्जेक्ट्स की एक सूची है... आ

  1. रूबी ऑब्जेक्ट्स को डेकोरेटर पैटर्न से बढ़ाएं: एक व्यावहारिक गाइड रूबी ऑब्जेक्ट्स को डेकोरेटर पैटर्न से बढ़ाएं: एक व्यावहारिक गाइड

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