रूबी 'आवश्यकता' त्रुटि: ऐसी फ़ाइल लोड नहीं कर सकता


169

मेरे पास एक फ़ाइल है, निम्नलिखित सामग्री के साथ main.rb:

require "tokenizer.rb"

Tokenizer.rb फ़ाइल एक ही निर्देशिका में है और इसकी सामग्री है:

class Tokenizer
    def self.tokenize(string)
        return string.split(" ")
    end
end

अगर मैं main.rb चलाने की कोशिश करूँ तो मुझे निम्नलिखित त्रुटि मिलेगी:

C:\Documents and Settings\my\src\folder>ruby main.rb

C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tokenizer.rb (LoadError)
        from C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require '
        from main.rb:1:in `<main>'

मैंने अभी देखा कि अगर मैं सब कुछ ठीक loadकरने के बजाय उपयोग requireकरता हूं । यहां क्या समस्या हो सकती है?



जांचें कि फ़ाइल में .rbएक्सटेंशन है
onmyway133

जवाबों:


189

मैंने बस कोशिश की और यह साथ काम करता है require "./tokenizer"। उम्मीद है की यह मदद करेगा।


15
यह मानता है कि CWD वह निर्देशिका है जिसे स्क्रिप्ट में संग्रहीत किया जाता है।
डेविड ग्रेसन

25
... यही कारण है कि मुझे लगता है कि इसका उपयोग करना बेहतर है require_relativeजैसा कि मैंने अपने जवाब में किया था।
डेविड ग्रेसन

180

बस यह करें:

require_relative 'tokenizer'

यदि आप इसे रूबी फ़ाइल में रखते हैं जो उसी निर्देशिका में है tokenizer.rb, तो यह ठीक काम करेगी, चाहे आपकी वर्तमान कार्यशील निर्देशिका (CWD) क्या हो।

यह सबसे अच्छा तरीका क्यों है की व्याख्या

अन्य उत्तर दावा करते हैं कि आपको इसका उपयोग करना चाहिए require './tokenizer', लेकिन यह गलत उत्तर है, क्योंकि यह केवल तभी काम करेगा जब आप अपनी रूबी प्रक्रिया को उसी निर्देशिका में चलाएंगे जो tokenizer.rbबहुत सुंदर है। केवल इस requireतरह से उपयोग करने पर विचार करने का एकमात्र कारण है कि यदि आपको आवश्यकता होगी। रूबी 1.8 का समर्थन करते हैं, जो नहीं है require_relative

require './tokenizer'इस सवाल का जवाब आज आप के लिए काम कर सकते हैं, लेकिन यह अनावश्यक रूप से तरीके हैं जिनसे आप अपने रूबी कोड चला सकते हैं सीमित करता है। कल, यदि आप अपनी फ़ाइलों को एक अलग निर्देशिका में ले जाना चाहते हैं, या बस एक अलग निर्देशिका से अपनी रूबी प्रक्रिया शुरू करना चाहते हैं, तो आपको उन सभी requireकथनों पर पुनर्विचार करना होगा ।

requireलोड पथ पर पहुंचने वाली फ़ाइलों का उपयोग करना एक अच्छी बात है और रूबी रत्न हर समय ऐसा करते हैं। लेकिन आप के लिए तर्क शुरू नहीं करना चाहिए requireएक साथ .कुछ बहुत ही खास है जब तक आप कर रहे हैं और पता है कि तुम क्या कर रहे हैं।

जब आप ऐसा कोड लिखते हैं जो इसके पर्यावरण के बारे में धारणा बनाता है, तो आपको ध्यान से सोचना चाहिए कि क्या धारणाएं बनाना है। इस मामले में, tokenizerफ़ाइल की आवश्यकता के लिए तीन अलग-अलग तरीके हैं , और प्रत्येक एक अलग धारणा बनाता है:

  1. require_relative 'path/to/tokenizer': मान लें कि दो रूबी स्रोत फ़ाइलों के बीच सापेक्ष पथ एक ही रहेगा।
  2. require 'path/to/tokenizer': मान लें कि path/to/tokenizerलोड पथ ( $LOAD_PATH) पर निर्देशिकाओं में से एक के अंदर है । इसके लिए आमतौर पर अतिरिक्त सेटअप की आवश्यकता होती है, क्योंकि आपको लोड पथ में कुछ जोड़ना होगा।
  3. require './path/to/tokenizer': मान लेता है कि रूबी प्रक्रिया की वर्तमान कार्य निर्देशिका से संबंधित पथ tokenizer.rbउसी के रहने वाला है।

मुझे लगता है कि ज्यादातर लोगों और अधिकांश स्थितियों के लिए, विकल्प # 1 और # 2 में की गई धारणाएं समय के साथ सच होने की अधिक संभावना है।


क्या आप बता सकते हैं कि इसका अर्थ क्या है? यह पर्दे के पीछे क्या करता है? धन्यवाद।
साइड स्मिथ

जानने के लिए बहुत कुछ नहीं है। यहां प्रलेखन और आवश्यकता के लिए स्रोत कोड है।
डेविड ग्रेसन

90

रूबी 1.9 ने वर्तमान निर्देशिका को लोड पथ से हटा दिया है, और इसलिए आपको इस फाइल पर एक रिश्तेदार की आवश्यकता होगी, जैसा कि डेविड ग्रेस कहते हैं:

require_relative 'tokenizer'

.rbरूबी के स्मार्ट होने के साथ इसे पर्याप्त करने की ज़रूरत नहीं है , यह जानने के लिए कि आपका वैसे भी क्या मतलब है।


1
मुझे पता था कि यह कुछ बेवकूफी भरी बात होगी, मदद के लिए धन्यवाद
कोडिंग मोंक

3
यह मानता है कि CWD वह निर्देशिका है जिसे स्क्रिप्ट में संग्रहीत किया जाता है।
डेविड ग्रेसन

@RyanBigg - मैं माणिक के लिए नया हूं। क्या आप इसका अर्थ बता सकते हैं - इसका मतलब क्या है Ruby 1.9 has removed the current directory from the load path? यह वर्तमान निर्देशिका और लोड पथ क्या है? धन्यवाद।
सिड स्मिथ

मुझे ओपी में क्या पढ़ना चाहिए? सिर्फ इसलिए कि ओपी को सीडब्ल्यूडी के साथ निर्देशिका के बराबर हुआ क्योंकि लिपियों का मतलब यह नहीं है कि यह हमेशा ऐसा ही रहने वाला है, इसलिए मैं उपयोग करने की तरह अधिक मजबूत समाधान के लिए धक्का देना पसंद करता हूं require_relative। कल वह टाइप कर सकता है cd ..और फिर ruby folder/main.rbदुखी हो सकता है कि आपका समाधान अब काम नहीं करता है। मुझे नहीं लगता कि यहाँ उपयोग करने requireसे कोई लाभ है।
डेविड ग्रेसन

1
अपडेट किया गया require_relative(जो मौजूद नहीं था, या मुझे इसके बारे में पता नहीं था, पोस्टिंग के समय)
रयान बिग जी

37

requireसे एक फ़ाइल लोड करता है $LOAD_PATH। यदि आप वर्तमान में निष्पादित फ़ाइल के सापेक्ष फ़ाइल की आवश्यकता चाहते हैं $LOAD_PATH, तो इसके बजाय से , का उपयोग करें require_relative


14

मैं सलाह दूँगा,

load './tokenizer.rb'

यह देखते हुए, कि आप जानते हैं कि फ़ाइल उसी कार्यशील निर्देशिका में है।

यदि आप फ़ाइल के सापेक्ष इसकी आवश्यकता की कोशिश कर रहे हैं, तो आप उपयोग कर सकते हैं

require_relative 'tokenizer'

आशा है कि ये आपकी मदद करेगा।


11

एक और अच्छी छोटी विधि के साथ अपने लोड पथ में वर्तमान निर्देशिका को शामिल करना है

$:.unshift('.')

आप इसे $ पर धकेल सकते हैं: ($ LOAD_PATH) सरणी लेकिन unshift इसे आपके वर्तमान कार्य निर्देशिका को लोड पथ के शेष भाग से पहले लोड करने के लिए बाध्य करेगी।

एक बार जब आप अपने लोड पथ में अपनी वर्तमान निर्देशिका जोड़ लेते हैं तो आपको निर्दिष्ट रखने की आवश्यकता नहीं होती है

 require './tokenizer' 

और बस उपयोग करने के लिए वापस जा सकते हैं

require 'tokenizer'

5

यह अच्छी तरह से काम करेगा अगर यह एक मणि काम कर रहा है और यह tokenizer.rb है

require_relative 'tokenizer/main'

1

मैंने अपने रूबी कोड को संकलित करने के लिए jruby-1.7.4 का उपयोग किया।

require 'roman-numerals.rb' 

वह कोड है जो नीचे की त्रुटि को फेंक देता है।

LoadError: no such file to load -- roman-numerals
  require at org/jruby/RubyKernel.java:1054
  require at /Users/amanoharan/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
   (root) at /Users/amanoharan/Documents/Aptana Studio 3 Workspace/RubyApplication/RubyApplication1/Ruby2.rb:2

मैंने आवश्यकता से आरबी हटा दिया और दिया

require 'roman-numerals' 

यह ठीक काम किया।


1

उन लोगों के लिए जो निश्चित रूप से अपने रिश्तेदार पथ सही हैं, मेरी समस्या यह थी कि मेरी फाइलों का .rbविस्तार नहीं था ! (भले ही मैं RubyMineफ़ाइलों को बनाने के लिए इस्तेमाल किया और चुना है कि वे Rubyनिर्माण पर फ़ाइलें थे ।)

अपनी फ़ाइल पर फ़ाइल एक्सटेंशन को दोबारा जांचें!



0

समस्या यह है कि requireवर्तमान निर्देशिका से लोड नहीं होता है। यह वही है जो मैंने सोचा था, लेकिन फिर मुझे यह धागा मिला । उदाहरण के लिए मैंने निम्नलिखित कोड की कोशिश की:

irb> f = File.new('blabla.rb')
=> #<File:blabla.rb>
irb> f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
LoadError: cannot load such file -- blabla.rb
        from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from (irb):24
        from D:/dev/Ruby193/bin/irb:12:in `<main>'

जैसा कि यह देखा जा सकता है कि यह फ़ाइल को ठीक से पढ़ता है, लेकिन मुझे इसकी आवश्यकता नहीं थी (पथ को मान्यता नहीं मिली थी)। और यहाँ कोड काम करता है:

irb f = File.new('D://blabla.rb')
=> #<File:D://blabla.rb>
irb f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
=> true

जैसा कि आप देख सकते हैं कि क्या आप पूरी तरह से फ़ाइल लोड को सही तरीके से निर्दिष्ट करते हैं।


1
ये पसंद का सवाल है। मैं व्यक्तिगत रूप से हमेशा परीक्षण करना पसंद करता हूं कि मैं इंटरैक्टिव कंसोल में क्या कर रहा हूं। मैं काफी गलतियां करता हूं, और मुझे इंटरेक्टिव फीडबैक मिलना पसंद है।
बोरिस स्ट्रैंडजेव

0

प्रथम :

$ sudo gem install colored2

और, आपको अपना पासवर्ड इनपुट करना चाहिए

फिर :

$ sudo gem update --system  

रूबीज-अपडेट अपडेट को प्रकट करें: रत्न को निष्पादित करते समय ... (OpenSSL :: SSL :: SSLError) होस्टनाम "gem.ruby-china.org" सर्वर प्रमाणपत्र से मेल नहीं खाता

फिर:

$  rvm -v
$ rvm get head

अंतिम आप किस भाषा का उपयोग करना चाहते हैं ?? [स्विफ्ट / ओबीजीसी]

ObjC

क्या आप अपनी लाइब्रेरी के साथ डेमो एप्लिकेशन को शामिल करना चाहेंगे? [ हाँ नही ]

हाँ

आप कौन से परीक्षण ढांचे का उपयोग करेंगे? [स्पेका / कीवी / कोई नहीं]

कोई नहीं

क्या आप दृश्य आधारित परीक्षण करना चाहेंगे? [ हाँ नही ]

नहीं

आपकी कक्षा उपसर्ग क्या है?

XMG

अपने नए पुस्तकालय पर पॉड इंस्टॉल करना।


-2

आपको रास्ता देने की जरूरत है। कम से कम आपको वर्तमान निर्देशिका से रास्ता देना चाहिए। यह निश्चित रूप से काम करेगा। ।/फ़ाइल का नाम


स्पष्टता के लिए, मुझे लगता है कि आपको फ़िक्स के साथ यहां बार-बार कोड देना चाहिए। डाउन वोट मेरा नहीं है
रोहित गुप्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.