以下の内容を含む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
を使用すれば、すべてうまくいくことに気づきました。何が問題なのでしょうか。
私が試したところ、require "./tokenizer"
で動作します。お役に立てれば。
これをしてください。
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つあり、それぞれ異なる仮定をします。
require_relative 'path/to/tokenizer'
:2つのRubyソースファイル間の相対パスは同じままであると仮定します。require 'path/to/tokenizer'
:path/to/tokenizer
がロードパス($LOAD_PATH
)上のディレクトリの1つの中にあると仮定します。ロードパスに何か追加する必要があるので、これは一般的に追加の設定を必要とします。require './path/to/tokenizer'
:Rubyプロセスの現在の作業ディレクトリからtokenizer.rb
への相対パスは変わらないと仮定します。私は、ほとんどの人とほとんどの状況で、オプション#1と#2で行われた仮定が時間の経過とともに当てはまる可能性が高いと思います。
Ruby 1.9ではロードパスから現在のディレクトリが削除されたため、David Graysonが言うように、このファイルに対して相対的な要求を行う必要があります。
require_relative 'tokenizer'
Rubyはそれがあなたがとにかく意味するものであることを知っているのに十分賢いので、.rb
でそれを接尾辞にする必要はありません。
require
は$LOAD_PATH
からファイルをロードします。 $LOAD_PATH
からではなく、現在実行中のファイルに相対的なファイルが必要な場合は、require_relative
を使用します。
私がお勧めします、
load './tokenizer.rb'
ファイルが同じ作業ディレクトリにあることを知っているとします。
ファイルに関連してそれを要求しようとしているなら、あなたは使うことができます
require_relative 'tokenizer'
これが役に立つことを願っています。
もう1つの良い方法は、現在のディレクトリをロードパスに含めることです。
$:.unshift('.')
それを$:($ LOAD_PATH)配列にプッシュすることもできますが、シフトを解除すると、ロードパスの残りの部分の前に現在の作業ディレクトリを強制的にロードします。
ロードパスに現在のディレクトリを追加したら、指定し続ける必要はありません。
require './tokenizer'
そしてただ使用に戻ることができます
require 'tokenizer'
これがgem libディレクトリにあり、これがtokenizer.rbである場合、これはうまく機能します。
require_relative 'tokenizer/main'
最初 :
$ Sudo gem install colored2
そして、あなたはあなたのパスワードを入力するべきです
その後:
$ Sudo gem update --system
Rubygems-updateの更新中にエラーが発生しました。
その後:
$ rvm -v
$ rvm get head
最後にどの言語を使いますか? [Swift/ObjC]
目的
ライブラリにデモアプリケーションを含めますか? [ はい・いいえ ]
はい
どのテストフレームワークを使用しますか? [スペクトル/キウイ/なし]
None
ビューベースのテストをしますか? [ はい・いいえ ]
いいえ
あなたのクラスの接頭辞は何ですか?
XMG
新しいライブラリでpod installを実行します。
相対パスが正しいことを絶対に確信している人たちにとって、私の問題は私のファイルが.rb
拡張子を持っていないということでした! (ファイルの作成にRubyMine
を使用し、作成時にそれらがRuby
ファイルであることを選択したにもかかわらず)
ファイルの拡張子をもう一度確認してください。
私は自分の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'
それはうまくいった。
現在のディレクトリを検索パスに含めることはどうですか。
Ruby -I. main.rb
問題は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
フルパスを指定しているかどうかがわかるように、ファイルは正しくロードされています。