Ruby 'require'エラー:そのようなファイルをロードできません


169

次の内容のmain.rbファイルが1つあります。

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拡張

回答:


189

私は試してみましたが、で動作しrequire "./tokenizer"ます。お役に立てれば。


15
これは、CWDは、スクリプトがに格納されていることをディレクトリであることを前提としています。
デビッド・グレイソン

25
...そのためrequire_relative、私の回答と同じように使用する方が良いと思います。
David Grayson 2013

180

これを行うだけです:

require_relative 'tokenizer'

これをと同じディレクトリにあるRubyファイルに入れるとtokenizer.rb、現在の作業ディレクトリ(CWD)が何であっても問題なく動作します。

これが最善の方法である理由の説明

他の回答ではを使用する必要があると主張していますが、Rubyプロセスを同じディレクトリで実行する場合にのみ機能するため、これrequire './tokenizer'間違った回答ですtokenizer.rb。このrequireような使用を検討する理由は、 Ruby 1.8には対応していませんrequire_relative

require './tokenizer'今日の答えはうまくいくかもしれませんが、Rubyコードを実行する方法を不必要に制限します。明日、ファイルを別のディレクトリに移動したい場合、またはRubyプロセスを別のディレクトリから開始したい場合は、これらすべてのrequireステートメントを再考する必要があります。

requireロードパスにあるファイルへのアクセスに使用することは問題ありませんが、Ruby gemは常にそれを実行します。しかし、非常に特別なことをしていて、自分が何をしているかを理解しrequireているので.ない限り、で引数を開始しないでください。

環境についての仮定を行うコードを作成するときは、どのような仮定を行うかについて慎重に検討する必要があります。この場合、tokenizerファイルを要求する方法は3つまであり、それぞれ異なる仮定を持っています。

  1. require_relative 'path/to/tokenizer':2つのRubyソースファイル間の相対パスは同じままであると想定しています。
  2. require 'path/to/tokenizer'path/to/tokenizerロードパス($LOAD_PATH)のいずれかのディレクトリ内にあると想定します。ロードパスに何かを追加する必要があるため、これには通常、追加の設定が必要です。
  3. require './path/to/tokenizer':Rubyプロセスの現在の作業ディレクトリからの相対パスtokenizer.rbが同じままであると仮定します。

ほとんどの人とほとんどの状況で、オプション#1と#2で行われた仮定は、時間の経過とともに当てはまる可能性が高いと思います。


これの意味がわかりますか?それは舞台裏で何をしますか?ありがとう。
sid smith 14

知ることはあまりありません。require_relative のドキュメントソースコードは次のとおりです。
デビッドグレイソン2014

90

Ruby 1.9はロードパスから現在のディレクトリを削除したため、David Graysonが言うように、このファイルに対して相対的なrequireを実行する必要があります。

require_relative 'tokenizer'

.rbRubyはとにかくそれがあなたが何を意味するのかを知るのに十分スマートなので、それを接尾辞で付ける必要はありません。


1
私はこれが愚かなことになることを知っていました、助けてくれてありがとう
The Coding Monk

3
これは、CWDは、スクリプトがに格納されていることをディレクトリであることを前提としています。
デビッド・グレイソン

@RyanBigg-私はルビーが初めてです。これが何を意味するのか説明していただけますRuby 1.9 has removed the current directory from the load pathか?この現在のディレクトリとロードパスは何ですか?ありがとう。
sid smith '09 / 09/21

OPで何を読むべきですか?OPがCWDをスクリプトのあるディレクトリと同じにしたからといって、それが常にそうであるとは限らないので、のようなより堅牢なソリューションを求めていrequire_relativeます。明日彼はタイプcd ..し、ruby folder/main.rbそして悲しいことにあなたの解決策はもう機能しません。requireここで使用することには何の利点もないと思います。
David Grayson 2014

1
更新時require_relative(存在しなかったか、投稿時に知らなかった)
Ryan Bigg '23 / 09/23

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

これがgem libディレクトリにあり、これが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

rbをrequireから削除して与えた

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
それは選択の問題です。個人的には、常にインタラクティブコンソールで何をしているかをテストしたいと思っています。私は多くの間違いを犯し、インタラクティブなフィードバックを得るのが好きです。
Boris Strandjev 2012年

0

最初 :

$ sudo gem install colored2

そして、あなたはあなたのパスワードを入力する必要があります

次に:

$ sudo gem update --system  

更新rubygems-updateエラーが表示されます:gemの実行中に...(OpenSSL :: SSL :: SSLError)ホスト名 "gems.ruby-china.org"がサーバー証明書と一致しません

次に:

$  rvm -v
$ rvm get head

最後に何語を使いたいですか?[Swift / ObjC]

ObjC

ライブラリにデモアプリケーションを含めますか?[ はい・いいえ ]

はい

どのテストフレームワークを使用しますか?[スペクタ/キウイ/なし]

なし

ビューベースのテストを実行しますか?[ はい・いいえ ]

番号

クラスの接頭辞は何ですか?

XMG

新しいライブラリでポッドインストールを実行します。


-2

パスを与える必要があります。少なくとも、現在のディレクトリからのパスを指定する必要があります。それは確かに動作します。。/ファイル名


わかりやすくするために、ここでは修正を加えてコードの一部を繰り返す必要があると思います。反対票は私のものではない
Rohit Gupta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.