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

रूबी मेटाप्रोग्रामिंग:वास्तविक दुनिया के उदाहरण

आपने पहले रूबी मेटाप्रोग्रामिंग के बारे में पढ़ा होगा।

लेकिन…

यदि आपके पास कुछ विशिष्ट उदाहरण नहीं हैं तो यह थोड़ा भ्रमित करने वाला हो सकता है।

इसीलिए इस लेख में :

हम रूबी मेटाप्रोग्रामिंग का उपयोग करके कुछ लोकप्रिय ओपन-सोर्स प्रोजेक्ट देखने जा रहे हैं।

जैसे प्रोजेक्ट :

  • रेल
  • सिनात्रा
  • पेपरक्लिप रत्न

वे सभी किसी न किसी रूप में मेटाप्रोग्रामिंग . का उपयोग करते हैं ।

आइए कोड को देखें और पता करें कि वे वास्तव में क्या कर रहे हैं!

रेल उदाहरण

रेल मेटाप्रोग्रामिंग का भारी उपयोग करती है, इसलिए यह देखना शुरू करने के लिए एक अच्छी जगह है।

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

जब आप अपने रेल ऐप में वर्तमान परिवेश की जांच करना चाहते हैं, तो आप निम्न की तरह कुछ करते हैं।

Rails.env.production?

लेकिन क्या है env ? और यह कैसे काम करता है?

जवाब StringInquirer . में हैं वर्ग, जो String . का उपवर्ग है . यह वर्ग method_missing . का उपयोग करता है ताकि आप env.production? . पर कॉल कर सकें env == production . के बजाय ।

कोड इस तरह दिखता है :

def method_missing(method_name, *arguments)
  if method_name[-1] == '?'
    self == method_name[0..-2]
  else
    super
  end
end

यह कह रहा है :

"यदि विधि का नाम प्रश्नवाचक चिह्न के साथ समाप्त होता है तो तुलना करें, अन्यथा पूर्वजों की श्रृंखला में ऊपर जाते रहें"।

मूल कोड यहां पाया जा सकता है।

सिनात्रा प्रतिनिधिमंडल

यदि आपने पहले सिनात्रा का उपयोग किया है तो आप जान सकते हैं कि आपके मार्गों को परिभाषित करने के दो तरीके हैं:

  • get . का उपयोग करके / post किसी भी वर्ग के बाहर सीधे तरीके।
  • एक वर्ग को परिभाषित करके जो Sinatra::Application . से विरासत में मिला है ।

सिनात्रा डीएसएल (डोमेन-विशिष्ट भाषा) विधियों को Sinatra::Application के अंदर परिभाषित किया गया है , तो आप उन्हें इस कक्षा के बाहर कैसे उपयोग कर सकते हैं?

खैर, यहां दो चीजें चल रही हैं :

  • मेटाप्रोग्रामिंग
  • मॉड्यूल एक्सटेंशन

सिनात्रा Sinatra::Delegator . को परिभाषित करता है base.rb के अंदर मॉड्यूल, जिसका उपयोग विधि कॉल को target . पर भेजने के लिए किया जाता है ।

लक्ष्य Sinatra::Application . पर सेट है डिफ़ॉल्ट रूप से।

यह delegate . का सरलीकृत संस्करण है क्लास मेथड, Sinatra::Delegator . में परिभाषित :

def self.delegate(*methods)
  methods.each do |method_name|
   define_method(method_name) do |*args, &block|
     Delegator.target.send(method_name, *args, &block)
   end
  end
end

delegate :get, :patch, :put, :post, :delete

यह कोड विधियों का एक सेट बना रहा है (define_method . के साथ) ) जो विधि कॉल को Sinatra::Application . पर अग्रेषित करेगा (Delegator.target . के लिए डिफ़ॉल्ट मान )।

फिर main ऑब्जेक्ट Sinatra::Delegator . में परिभाषित विधियों के साथ विस्तारित है , जो सिनात्रा डीएसएल को Sinatra::Application . के बाहर उपलब्ध कराता है कक्षा।

यह ध्यान देने योग्य है कि रूबी में विधि प्रतिनिधिमंडल के लिए दो अंतर्निहित कक्षाएं हैं, यदि आपको उनकी आवश्यकता है:प्रतिनिधि और अग्रेषित करने योग्य।

द पेपरक्लिप जेम

पेपरक्लिप एक रत्न है जो आपके एप्लिकेशन को फ़ाइल अपलोड को संभालने की अनुमति देता है। फ़ाइलें ActiveRecord . से संबद्ध हैं मॉडल।

आप किसी मॉडल पर संलग्न फ़ाइल को has_attached_file . का उपयोग करके परिभाषित कर सकते हैं विधि।

इसे पसंद करें :

class User
  has_attached_file :avatar, :styles => { :normal => "100x100#" }
end

इस विधि को paperclip.rb पर परिभाषित किया गया है और यह मॉडल पर एक विधि को परिभाषित करने के लिए मेटाप्रोग्रामिंग का उपयोग करता है।

इस विधि का उपयोग फ़ाइल अटैचमेंट तक पहुँचने के लिए किया जा सकता है (जो कि Paperclip::Attachment का एक उदाहरण है। कक्षा)।

उदाहरण के लिए, यदि संलग्न फ़ाइल :avatar है , Paperclip एक avatar परिभाषित करेगा मॉडल पर विधि।

यह रहा define_instance_getter विधि, जो उसके लिए जिम्मेदार है:

# @name  => The name of the attachment
# @klass => The ActiveRecord model where this method is being defined

def define_instance_getter
  name    = @name
  options = @options

  @klass.send :define_method, @name do |*args|
    ivar = "@attachment_#{name}"
    attachment = instance_variable_get(ivar)

    if attachment.nil?
      attachment = Attachment.new(name, self, options)
      instance_variable_set(ivar, attachment)
    end
  end
end

इस कोड से हम देख सकते हैं कि अटैचमेंट ऑब्जेक्ट @attachment_#{name} के तहत स्टोर किया गया है आवृत्ति चर।

हमारे उदाहरण पर जो होगा @attachment_avatar

फिर यह जांचता है कि क्या यह अनुलग्नक पहले से मौजूद है, और यदि ऐसा नहीं है, तो यह एक नया Attachment बनाता है ऑब्जेक्ट और आवृत्ति चर सेट करता है।

यहाँ मूल स्रोत कोड है।

निष्कर्ष

जैसा कि आपने देखा, मेटाप्रोग्रामिंग एक बहुत शक्तिशाली और लचीली तकनीक है, लेकिन जब भी आप उस तक पहुंचना चाहते हैं तो उस उद्धरण को याद रखें जो कहता है:"महान शक्ति के साथ बड़ी जिम्मेदारी आती है"।

अगर आपको यह पोस्ट अच्छी लगी हो तो मेरे न्यूज़लेटर को सब्सक्राइब करना न भूलें 🙂


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

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

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

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

  1. मेटाप्रोग्रामिंग की छिपी लागत

    मेटाप्रोग्रामिंग एक बहुत ही फैंसी शब्द की तरह लगता है, लेकिन क्या यह अच्छा है? यह उपयोगी हो सकता है, लेकिन बहुत से लोग यह नहीं समझते हैं कि मेटाप्रोग्रामिंग का उपयोग करने की कुछ लागतें हैं। ठीक वैसे ही हम एक ही पृष्ठ पर हैं… मेटाप्रोग्रामिंग क्या है बिल्कुल? मैं मेटाप्रोग्रामिंग को किसी भी विधि