आपने पहले रूबी मेटाप्रोग्रामिंग के बारे में पढ़ा होगा।
लेकिन…
यदि आपके पास कुछ विशिष्ट उदाहरण नहीं हैं तो यह थोड़ा भ्रमित करने वाला हो सकता है।
इसीलिए इस लेख में :
हम रूबी मेटाप्रोग्रामिंग का उपयोग करके कुछ लोकप्रिय ओपन-सोर्स प्रोजेक्ट देखने जा रहे हैं।
जैसे प्रोजेक्ट :
- रेल
- सिनात्रा
- पेपरक्लिप रत्न
वे सभी किसी न किसी रूप में मेटाप्रोग्रामिंग . का उपयोग करते हैं ।
आइए कोड को देखें और पता करें कि वे वास्तव में क्या कर रहे हैं!
रेल उदाहरण
रेल मेटाप्रोग्रामिंग का भारी उपयोग करती है, इसलिए यह देखना शुरू करने के लिए एक अच्छी जगह है।
उदाहरण के लिए :
जब आप अपने रेल ऐप में वर्तमान परिवेश की जांच करना चाहते हैं, तो आप निम्न की तरह कुछ करते हैं।
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 बनाता है ऑब्जेक्ट और आवृत्ति चर सेट करता है।
यहाँ मूल स्रोत कोड है।
निष्कर्ष
जैसा कि आपने देखा, मेटाप्रोग्रामिंग एक बहुत शक्तिशाली और लचीली तकनीक है, लेकिन जब भी आप उस तक पहुंचना चाहते हैं तो उस उद्धरण को याद रखें जो कहता है:"महान शक्ति के साथ बड़ी जिम्मेदारी आती है"।
अगर आपको यह पोस्ट अच्छी लगी हो तो मेरे न्यूज़लेटर को सब्सक्राइब करना न भूलें 🙂