2011-05-13 12 views
19

loadee.rbलोड स्थानीय पथ पर काम करता है, की आवश्यकता होती है नहीं

puts '> This is the second file.' 

loaddemo.rb

puts 'This is the first (master) program file.' 
load 'loadee.rb' 
puts 'And back again to the first file.' 

जब मैं "ruby loaddemo.rb" चलाने के लिए, यह ठीक काम करता है। दोनों फाइलें एक ही निर्देशिका में हैं, और यही वह निर्देशिका है जिसे मैं चलाता हूं।

लेकिन अगर मैं एक की आवश्यकता के लिए लोड बदलने के लिए, और के साथ या बिना विस्तार मैं:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load 
-- loadee.rb (LoadError) 
     from <internal:lib/rubygems/custom_require>:29:in `require' 
     from loaddemo.rb:2:in `<main>' 

मेरा प्रश्न निश्चित रूप से है, क्यों इस मामले में काम कर की आवश्यकता नहीं है? यह सही होना चाहिए? लोड करें और विभिन्न पथों का उपयोग करने की आवश्यकता है?

रूबी संस्करण 1.9.2

उत्तर

38

आप require करने के लिए सिर्फ एक फ़ाइल नाम प्रदान करते हैं, तो वह केवल पूर्वनिर्धारित $LOAD_PATH निर्देशिका में दिखेगा। हालांकि, अगर आप अपने फ़ाइल नाम के साथ एक रास्ता प्रदान करते हैं यह काम करना चाहिए:

$LOAD_PATH.unshift File.dirname(__FILE__) 
puts 'This is the first (master) program file.' 
require 'loadee.rb' 
puts 'And back again to the first file.' 

और आखिरी, तो आप सिर्फ require_relative इस्तेमाल कर सकते हैं:

puts 'This is the first (master) program file.' 
require './loadee.rb' 
puts 'And back again to the first file.' 

तुम भी बजाय लोड पथ के लिए अपनी परियोजना के फ़ोल्डर जोड़ सकते हैं बजाय: फ़ाइल नाम के साथ मेरे लिए काम करने के लिए नहीं लग रहा था

puts 'This is the first (master) program file.' 
require_relative 'loadee.rb' 
puts 'And back again to the first file.' 
+2

तो लोड के बिना लोड क्यों काम करता है? क्या यह एक अलग पथ चर का उपयोग करता है? –

+1

यह वास्तव में रूबी के लिए वास्तव में एक बग के रूप में सूचीबद्ध है। 1.9 ने 'आवश्यकता' का उपयोग करते समय लोड पथ से "वर्तमान निर्देशिका" को हटा दिया, लेकिन 'लोड' के लिए नहीं। http://redmine.ruby-lang.org/issues/2710 –

+2

साथ ही, ध्यान रखें कि हर बार जब आप 'लोड' का उपयोग करते हैं, तो यह पूरी फ़ाइल का मूल्यांकन करता है, जबकि' आवश्यकता 'का उपयोग केवल पहली बार फ़ाइल का मूल्यांकन करता है यह। –

4

एक रास्ता प्रदान करना, और मैं अपने $LOAD_PATH में रास्तों में से एक गुच्छा रटना नहीं करना चाहता था।

documentation को चेक आउट करते हुए, मुझे require_relative मिला। 1.9.2 और 2.1.2 दोनों में

require_relative 'loadee' 

काम करता है।

documentation इंगित करता है कि require का उद्देश्य सापेक्ष पथों को खोजने का इरादा नहीं है, और न ही load है।

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