web-dev-qa-db-ja.com

Rubyの 'require'エラー:そのようなファイルを読み込めません

以下の内容を含む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を使用すれば、すべてうまくいくことに気づきました。何が問題なのでしょうか。

162
The Coding Monk

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

178
Pascal

これをしてください。

require_relative 'tokenizer'

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

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

他の回答ではrequire './tokenizer'を使うべきだと主張していますが、これは間違ったの回答です。なぜなら、tokenizer.rbがあるのと同じディレクトリでRubyプロセスを実行した場合にのみうまくいくからです。このようにrequireを使用するのは、require_relativeがないRuby 1.8をサポートする必要がある場合です。

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)上のディレクトリの1つの中にあると仮定します。ロードパスに何か追加する必要があるので、これは一般的に追加の設定を必要とします。
  3. require './path/to/tokenizer':Rubyプロセスの現在の作業ディレクトリからtokenizer.rbへの相対パスは変わらないと仮定します。

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

164
David Grayson

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

require_relative 'tokenizer'

Rubyはそれがあなたがとにかく意味するものであることを知っているのに十分賢いので、.rbでそれを接尾辞にする必要はありません。

85
Ryan Bigg

require$LOAD_PATHからファイルをロードします。 $LOAD_PATHからではなく、現在実行中のファイルに相対的なファイルが必要な場合は、require_relativeを使用します。

36
Jörg W Mittag

私がお勧めします、

load './tokenizer.rb'

ファイルが同じ作業ディレクトリにあることを知っているとします。

ファイルに関連してそれを要求しようとしているなら、あなたは使うことができます

require_relative 'tokenizer'

これが役に立つことを願っています。

14

もう1つの良い方法は、現在のディレクトリをロードパスに含めることです。

$:.unshift('.')

それを$:($ LOAD_PATH)配列にプッシュすることもできますが、シフトを解除すると、ロードパスの残りの部分の前に現在の作業ディレクトリを強制的にロードします。

ロードパスに現在のディレクトリを追加したら、指定し続ける必要はありません。

 require './tokenizer' 

そしてただ使用に戻ることができます

require 'tokenizer'
11
Pseudomonkey

これがgem libディレクトリにあり、これがtokenizer.rbである場合、これはうまく機能します。

require_relative 'tokenizer/main'
1

最初 :

$ Sudo gem install colored2

そして、あなたはあなたのパスワードを入力するべきです

その後:

$ Sudo gem update --system  

Rubygems-updateの更新中にエラーが発生しました。

その後:

$  rvm -v
$ rvm get head

最後にどの言語を使いますか? [Swift/ObjC]

目的

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

はい

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

None

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

いいえ

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

XMG

新しいライブラリでpod installを実行します。

0
Lxt_91424

相対パスが正しいことを絶対に確信している人たちにとって、私の問題は私のファイルが.rb拡張子を持っていないということでした! (ファイルの作成にRubyMineを使用し、作成時にそれらがRubyファイルであることを選択したにもかかわらず)

ファイルの拡張子をもう一度確認してください。

0
Andy Barnett

私は自分のRubyコードをコンパイルするのに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' 

それはうまくいった。

0

現在のディレクトリを検索パスに含めることはどうですか。

Ruby -I. main.rb
0
Hans-J. Schmid

問題は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

フルパスを指定しているかどうかがわかるように、ファイルは正しくロードされています。

0
Boris Strandjev