2009-04-29 10 views
49

मैं रूबी में require, load और autoload के बीच सूक्ष्म मतभेदों को समझता हूं, लेकिन मेरा सवाल यह है कि आप कैसे जानते हैं कि किस का उपयोग करना है?रूबी में 'आवश्यकता', 'लोड` या' ऑटोलोड 'का उपयोग कब करें?

अज्ञात मॉड्यूल में load को "लपेटें" करने में सक्षम होने के अलावा, require को प्राथमिकता दी जा रही है।

लेकिन तब autoload आलसी लोड फ़ाइलों के लिए आप की अनुमति देता है - जो शानदार लग रहा है, लेकिन मैं व्यावहारिक रूप से क्या आप require

से अधिक लाभ अन्य से अधिक पसंद एक तरीका है यकीन नहीं है? क्या ऐसी कोई स्थिति है जहां एक विधि खड़ी हो जाती है?

उत्तर

50

आम तौर पर, आपको require का उपयोग करना चाहिए। load हर बार कोड फिर से लोड करेगा, इसलिए यदि आप इसे कई मॉड्यूल से करते हैं, तो आप बहुत अधिक काम करेंगे। autoload की आलस्य सिद्धांत में अच्छी लगती है, लेकिन कई रूबी मॉड्यूल अन्य वर्गों को बंदर-पैचिंग जैसी चीजें करते हैं, जिसका अर्थ है कि आपके प्रोग्राम के असंबद्ध हिस्सों का व्यवहार इस बात पर निर्भर करता है कि किसी दिए गए वर्ग का उपयोग अभी तक किया गया है या नहीं। autoload has also been deprecated, इसलिए इसका उपयोग टालना चाहिए।

यदि आप अपना स्वयं का स्वचालित पुनः लोडर बनाना चाहते हैं जो आपके कोड को हर बार बदलता है या जब भी कोई यूआरएल हिट करता है (विकास उद्देश्यों के लिए आपको हर बार अपने सर्वर को पुनरारंभ करने की आवश्यकता नहीं है), तो load का उपयोग करना यह उचित है।

+14

मेरा मानना ​​है कि रूटी के भविष्य की रिलीज में 'ऑटोलोड' को बहिष्कृत किया जाएगा, एक टिप्पणी [http://www.ruby-forum.com/topic/3036681) मैट द्वारा। –

+2

नीचे बोरीस का उत्तर देखें जिसमें ऑटोलोड के बारे में हालिया चर्चा का एक लिंक शामिल है। यह अभी भी 2.1 में मौजूद है: http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload –

+3

यहां दिए गए उत्तर के 7 साल बाद हम हैं। क्या ऑटोलोड को बहिष्कृत किया गया है? – Donato

10

यहाँ आप autoloadrequire से अधिक के साथ क्या लाभ है:

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

एक और लाभ यह है कि यदि आप कुछ विशेषताओं का उपयोग नहीं करते हैं तो आपको कोड के कुछ हिस्सों को लोड करने की आवश्यकता नहीं हो सकती है - जिससे लोड समय में सुधार होता है और मेमोरी पदचिह्न को कम किया जाता है।

14

mylibrary.rb आईआरबी

irb(main):001:0> require 'mylibrary' 
I was loaded! 
=> true 

irb(main):001:0> autoload :MyLibrary, 'mylibrary' 
=> nil 
irb(main):002:0> MyLibrary.new 
I was loaded! 
=> #<MyLibrary:0x0b1jef> 

में

puts "I was loaded!" 

class MyLibrary 
end 

कोशिश अंतर देखें।

+3

प्रश्न पूछने वाले को आवश्यकता और स्वत: लोड के बीच का अंतर पता है, वह पूछ रहा था कि आपको दूसरे के बजाय एक का उपयोग कब करना चाहिए। –

+1

धन्यवाद एंड्रयू इसे इंगित करने के लिए। तुम सही हो। जैसा कि ऊपर उपयोगकर्ता 9 7 9 33 9 द्वारा उल्लिखित है ..autoload का उपयोग किया जाना चाहिए जहां समय महत्वपूर्ण है और फिर भी आप प्रक्रिया को तेज करना चाहते हैं। उदाहरण के लिए "पतली" जैसे अनुप्रयोग सर्वर में। यदि आप पतले स्रोत कोड को देखते हैं तो आपको पता चल जाएगा कि लेखक ने पतली कोर पार्ट्स जैसे कमांड, कनेक्शन और लॉगिंग को लोड करने की आवश्यकता के बजाय ऑटोलोड को इस्तेमाल किया है। – crazycrv

+0

आपको उन libs के बारे में सावधान रहना होगा जो रूबी stdlib और rubygems के साथ पंजीकृत नहीं हैं इसलिए स्थानीय lib के लिए उदाहरण के रूप में './filename-no ext' की आवश्यकता होती है। शायद आप इसे अपने कोड में ठीक कर सकते हैं और फिर मेरी टिप्पणी हटा सकते हैं? लेकिन सरल उदाहरण के लिए धन्यवाद। लेकिन 'लोड' के बारे में क्या? –

6

अन्य लोगों ने जो आपको पहले ही बताया है, इसके अलावा autoload का भविष्य अनिश्चित है। इसे रूबी 2.0 में बहिष्कृत किया जाना था, लेकिन 2.0 फीचर फ्रीज के लिए समय पर बहिष्करण नहीं किया गया था। अब यह उम्मीद की जाती है कि autoload रूबी 2.1, but that is not even certain anymore में बहिष्कृत किया जाएगा।

संबंधित मुद्दे