यह आर्टिकल Ruby में क्लास और मॉड्यूल ऑटोलोडिंग की व्याख्या करता है। जिसमें नया "Zeitwerk" gem शामिल है जो Rails 6 का हिस्सा है।
आइए एक प्रश्न से शुरू करते हैं...
हम कई सोर्स कोड फाइलों को एक में कैसे लाते हैं?
हम उन्हें require करते हैं।
एक फाइल को require करने से Ruby उसे पढ़ता है और अंदर का कोड चलाता है। लेकिन अगर हमारे पास require की गई फाइलों की एक सूची है तो शायद उन सभी को लोड करने की आवश्यकता नहीं है।
कम से कम तुरंत नहीं...
हम फाइलों को केवल तब कैसे लोड कर सकते हैं जब हमें उनकी आवश्यकता हो ताकि हम अपने एप्लिकेशन को तेजी से शुरू कर सकें?
यहीं ऑटोलोडिंग काम आती है!
ऑटोलोडिंग का उपयोग कैसे करें
Ruby में एक बिल्ट-इन ऑटोलोडिंग सुविधा है।
यह कॉन्स्टेंट्स पर आधारित है।
जब पहली बार Coconut जैसा कॉन्स्टेंट मिलता है, तो Ruby उससे जुड़ी फाइल को लोड करने का प्रयास करेगा।
लेकिन पहले:
आपको इस कॉन्स्टेंट को उसके फाइल नाम के साथ रजिस्टर करने की आवश्यकता है।
इस तरह:
autoload :Coconut, "lib/coconut.rb"
अब Ruby जानता है कि जब भी आप Coconut क्लास या मॉड्यूल का उपयोग करना चाहते हैं तो कहां देखना है।
लेकिन आप जानते हैं कि क्या और भी बेहतर होगा?
कल्पना करें कि यदि आपको मैन्युअली कॉन्स्टेंट्स रजिस्टर नहीं करने पड़ते और Ruby को ठीक-ठीक पता होता कि सब कुछ कहां ढूंढना है।
खैर...
यही Rails करता है, लेकिन पहले Rails 6 यह इस autoload मैकेनिज्म का उपयोग नहीं करता था।
Rails 6 से पहले Rails में ऑटोलोडिंग
मैं पूरी तरह से नहीं समझता कि यह कैसे काम करता है, लेकिन Rails autoload के बजाय const_missing का उपयोग करता है ताकि आपके प्रोजेक्ट में फाइलों को ऑटोमैटिकली ढूंढ और लोड कर सके।
यह उपयोगी क्यों है?
क्योंकि इसका मतलब है कि आपको अपने Rails प्रोजेक्ट्स में require का उपयोग नहीं करना पड़ता।
कन्वेंशन ओवर कॉन्फिगरेशन...
यह सब ऑटोमैटिकली होता है, बशर्ते आप नियमों का पालन करें।
नियम हैं:
- अपनी फाइल को वहां रखें जहां इसे ढूंढा जा सके (जैसा कि
ActiveSupport::Dependencies.autoload_pathsद्वारा परिभाषित) - प्रति फाइल एक क्लास / मॉड्यूल परिभाषित करें
- क्लास नाम के बाद फाइल का नाम रखें, अंडरस्कोर का उपयोग करके (
UsersController=>users_controller)
फिर...
जब भी आपका कोड इनमें से किसी भी क्लास नाम को संदर्भित करता है, Rails को पता चल जाएगा कि उन्हें कहां ढूंढना है।
बहुत उपयोगी।
Rails 6 के बाद Rails में ऑटोलोडिंग
Rails 6 एक नया कॉन्स्टेंट ऑटोलोडिंग मैकेनिज्म पेश करता है।
इसे Zeitwerk कहा जाता है।
यह "क्लासिक" Rails ऑटोलोडिंग से कैसे अलग है?
पुराने Rails वर्जन द्वारा उपयोग किए गए const_missing दृष्टिकोण के विपरीत, जिसमें मॉड्यूल नेस्टिंग जैसी जानकारी का अभाव होता है - जिसके परिणामस्वरूप कई सीमाएं होती हैं।
Zeitwerk Ruby के autoload का उपयोग करता है।
यह नया कार्यान्वयन समान फाइल-नामकरण कन्वेंशन का पालन करता है।
वास्तव में:
Zeitwerk क्लास नाम का अनुमान लगाने के लिए फाइल नाम का उपयोग करता है, users_controller => UsersController।
जो पहले के बिल्कुल विपरीत है।
बताते चलें, आप अभी भी autoload_paths का उपयोग कर सकते हैं, लेकिन आप केवल बेस पथ जोड़ना चाहते हैं, जैसे "/lib", "/lib/**" के बजाय।
क्यों?
यही वह तरीका है जिससे यह नेमस्पेसेस और नेस्टिंग के साथ काम करता है।
- यदि आपके पास ऑटोलोड में
"lib"है, और आप"Fruit::Orange"परिभाषित करना चाहते हैं, तो फाइल का नाम"lib/fruit/orange.rb"होना चाहिए। - लेकिन यदि आपके पास ऑटोलोड में
"lib/fruit"है, तो आपको एक और फोल्डर उपयोग करना होगा, इसलिए आपका फाइल नाम उसी क्लास के लिए"lib/fruit/fruit/orange.rb"हो जाता है।
सबसे अच्छी बात?
यह नई कार्यक्षमता Rails से चिपकी नहीं है, इसलिए आप इसे अपने नॉन-Rails प्रोजेक्ट्स में उपयोग कर सकते हैं!
सारांश
आपने Ruby में मॉड्यूल ऑटोलोडिंग के बारे में सीखा, वास्तव में यह क्या है और यह कैसे काम करता है!
इस नई समझ के साथ, आप अपने Ruby प्रोजेक्ट्स को सबसे प्रभावी तरीके से संरचित करने में सक्षम होंगे।
अब आपकी बारी है, अपना एडिटर खोलें और कुछ मज़ा करें।
पढ़ने के लिए धन्यवाद! 🙂