2012-04-24 15 views
19

की आवश्यकता कैसे है require को दूसरी बार फ़ाइल करने के लिए मजबूर करने का कोई तरीका है?दूसरी बार

मैं रूबी के पथ में स्थित एक पुस्तकालय लिख रहा हूं। आईआरबी में इसका एक सरल परीक्षण करते समय मैं फ़ाइल संपादित कर रहा हूं।

प्रत्येक बार जब मैं फ़ाइल में बदलाव करता हूं, तो मैं इसे आईआरबी सत्र समाप्त किए बिना पुनः लोड करना चाहता हूं। load का उपयोग प्रत्येक बार फ़ाइल के लिए पूरे पथ टाइप करने की आवश्यकता है, और प्रत्येक बार आईआरबी को पुनरारंभ करने के लिए मुझे सरल परीक्षण के लिए आवश्यक सभी अन्य चर सेटिंग्स को टाइप करने की आवश्यकता होती है।

मुझे बस require जैसा कुछ चाहिए लेकिन यह दूसरी बार लोड होने की अनुमति देता है। क्या ऐसा करने का कोई आसान तरीका है?

+0

क्या आईआरबी आपका एकमात्र विकल्प है? क्या आप 'pry' का उपयोग कर सकते हैं? –

उत्तर

24

load (पूर्ण) एक पूर्ण पथ की आवश्यकता नहीं है। यह एक विस्तार के साथ एक पूर्ण फ़ाइल नाम की उम्मीद है।

p load 'date.rb' #=> true 
p load 'date.rb' #=> true 
p load 'date' #=> LoadError 
+0

मुझे ".rb" होने के बीच के अंतर के बारे में पता था, लेकिन किसी भी तरह से मुझे पथ के बारे में पता नहीं चला। – sawa

4
:000> path = "extremely/long/path/to/my/file" 
:001> load path 
:002> load path 
4

आप अपनी खुद की लिख सकते हैं और अपने .irbrc में रख सकता है:

न्यू हॉटनेस

module Kernel 
    def reload(lib) 
    if old = $LOADED_FEATURES.find{|path| path=~/#{Regexp.escape lib}(\.rb)?\z/ } 
     load old 
    else 
     require lib 
    end 
    end 
end 

मिनट-पुराने और इसलिए पर्दाफाश

module Kernel 
    # Untested 
    def reload(lib) 
    if File.exist?(lib) 
     load lib 
    else 
     lib = "#{lib}.rb" unless File.extname(lib)=='.rb' 
     $:.each do |dir| 
     path = File.join(dir,lib) 
     return load(path) if File.exist?(path) 
     end 
    end 
    end 
end 

पुराने और बस्टेड संस्करण के लिए यदि आप RubyGems का समर्थन करना चाहते हैं तो आपको इसे और अधिक मजबूत बनाना होगा। इन समाधानों में से किसी के साथ

एक समस्या यह है कि जब यह होगा सवाल में फ़ाइल के लिए मजबूर-पुनः लोड, अगर कि बारी में फ़ाइल दूसरों पर require कॉल (के रूप में आम तौर पर रत्नों के साथ मामला है) उन फ़ाइलों को नहीं होगा है पुनः लोड।

इसके आसपास काम करना वास्तव में बदसूरत होगा। जैसे, मैन्युअल रूप से $LOADED_FEATURES सरणी में पहुंच रहा है और मणि के नाम से संबंधित सभी पथों को निकाल रहा है। shudder

+0

मैंने मौजूदा आवश्यकता जादू का लाभ लेने वाला एक सरल संस्करण शामिल करने के लिए उत्तर संपादित किया है। – Phrogz

+0

सहायता के लिए धन्यवाद। असल में, मेरा सवाल बेवकूफ हो सकता है। स्टीन्सलैग जवाब के रूप में, मुझे पथ के बारे में चिंतित होने की आवश्यकता नहीं हो सकती है। लेकिन आपका कोड उपयोगी होगा। – sawa