রুবি 'প্রয়োজনীয়' ত্রুটি: এ জাতীয় ফাইল লোড করতে পারে না


169

আমি নিম্নলিখিত ফাইলের সাথে একটি ফাইল, প্রধান.আরবি করেছি:

require "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এক্সটেনশন করেছে কিনা পরীক্ষা করুন
onwayway133

উত্তর:


189

আমি চেষ্টা করেছি এবং এটি কাজ করে require "./tokenizer"। আশাকরি এটা সাহায্য করবে.


15
এটি ধরে নিয়েছে যে সিডব্লিউডি হ'ল ডিরেক্টরিটি স্ক্রিপ্টগুলি সংরক্ষণ করা হয়েছে
ডেভিড গ্রেসন

25
... সে কারণেই আমি require_relativeআমার উত্তরে যেমনটি ব্যবহার করেছি তত ভাল বলে মনে করি ।
ডেভিড গ্রেসন

180

শুধু এটি করুন:

require_relative 'tokenizer'

আপনি যদি tokenizer.rbএটিকে একই ডিরেক্টরিতে থাকা একটি রুবি ফাইলটিতে রাখেন তবে এটি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরি (সিডাব্লুডি) যাই হোক না কেন এটি দুর্দান্ত কাজ করবে।

কেন এটি সেরা উপায় তা ব্যাখ্যা Exp

অন্য উত্তরগুলির দাবি আপনার ব্যবহার করা উচিত require './tokenizer', তবে এটি ভুল উত্তর, কারণ এটি কেবল তখনই কাজ করবে যদি আপনি নিজের রুবি প্রসেসটি একই ডিরেক্টরিতে চালিত করেন P তবে আপনাকে এটির 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

রুবি ১.৯ লোড পাথ থেকে বর্তমান ডিরেক্টরিটি সরিয়ে নিয়েছে এবং তাই ডেভিড গ্রেসন যেমন বলেছিলেন তেমন আপনাকে এই ফাইলটির জন্য প্রয়োজনীয় কোনও আত্মীয় করতে হবে:

require_relative 'tokenizer'

এটি .rbযেহেতু আপনি বোঝাতে চেয়েছেন তা বুঝতে রুবি যথেষ্ট স্মার্ট হিসাবে এটি যুক্ত করার দরকার নেই ।


1
আমি জানতাম এটি কিছু বোকা জিনিস হতে চলেছে, সাহায্যের জন্য ধন্যবাদ
দ্য কোডিং সন্ন্যাসী

3
এটি ধরে নিয়েছে যে সিডব্লিউডি হ'ল ডিরেক্টরিটি স্ক্রিপ্টগুলি সংরক্ষণ করা হয়েছে
ডেভিড গ্রেসন

@ রায়ানবিগ - আমি রুবিতে নতুন। আপনি দয়া করে ব্যাখ্যা করতে পারেন এর অর্থ কী - Ruby 1.9 has removed the current directory from the load path? এই বর্তমান ডিরেক্টরি এবং লোড পথ কি? ধন্যবাদ।
স্মিথ

ওপিতে আমার কী পড়ার কথা? ওপিতে স্ক্রিপ্টগুলির সাথে ডিরেক্টরিতে সিডাব্লুডি সমান সংখ্যক ঘটেছে এর অর্থ এই নয় যে এটি সর্বদা সেভাবে হয়ে যায়, তাই আমি ব্যবহারের মতো আরও দৃ rob় সমাধানের জন্য চাপ দিতে চাই 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('.')

আপনি এটিকে $: (O LOAD_PATH) অ্যারেতে চাপতে পারেন তবে আনশিফ্ট এটিকে আপনার বর্তমান ভার্জিং ডিরেক্টরিটি লোডের বাকি পথের আগে লোড করতে বাধ্য করবে।

একবার আপনি আপনার লোড পাথে আপনার বর্তমান ডিরেক্টরিটি যুক্ত করলে আপনার নির্দিষ্টকরণের প্রয়োজন হবে না

 require './tokenizer' 

এবং কেবল ব্যবহারে ফিরে যেতে পারেন

require 'tokenizer'

5

এটি দুর্দান্তভাবে কাজ করবে যদি এটি কোনও রত্ন lib ডিরেক্টরিতে থাকে এবং এটি টোকেনাইজার.আরবি

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  

রুবিজেমস আপডেট আপডেট হওয়া উপস্থিত রয়েছে: রত্ন সম্পাদন করার সময় ... (ওপেনএসএসএল :: এসএসএল :: এসএসএলআরআর) হোস্টনাম "gems.ruby-china.org" সার্ভার শংসাপত্রের সাথে মেলে না

তারপর:

$  rvm -v
$ rvm get head

সর্বশেষ আপনি কোন ভাষাটি ব্যবহার করতে চান ?? [সুইফট / ওবিজেসি]

ObjC

আপনি কি আপনার লাইব্রেরির সাথে একটি ডেমো অ্যাপ্লিকেশন অন্তর্ভুক্ত করতে চান? [ হ্যাঁ না ]

হ্যাঁ

আপনি কোন টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করবেন? [স্পেকটা / কিউই / কিছুই নয়]

না

আপনি কি বেসড টেস্টিং দেখতে চান? [ হ্যাঁ না ]

না

আপনার ক্লাসের উপসর্গ কি?

XMG

আপনার নতুন লাইব্রেরিতে পড ইনস্টল চলছে।


-2

তোমার পথ দেওয়া দরকার কমপক্ষে আপনার বর্তমান ডিরেক্টরি থেকে পথ দেওয়া উচিত। এটা নিশ্চিতভাবে কাজ করবে। ./filename


স্পষ্টতার জন্য, আমি মনে করি আপনার এখানে কোডের বারবার অংশ ঠিক করা উচিত। ডাউন ভোট আমার নয়
রোহিত গুপ্ত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.