私はあなたのコードを実行しようとすると、私は単にそれがa.rb
ファイル、その後上昇し、LoadError
例外を見つけることができない、それはKernel's require method を使用していることを言っている、次のエラーメッセージ
$ ruby c.rb
~/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- a (LoadError)
from /Users/Sonna/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from c.rb:2:in `<main>'
を取得します。あなたはKernal's require_relative
method
require_relative "a"
require_relative "b"
を使用することができますし、それがc
ファイルへの相対それらa
& b
ファイルするファイルを必要とするために
。
それとも、彼らのカスタムスクリプトをロードするためにRubyの宝石で使用 一般的な慣例であるあなたのc.rb
ファイルに次のコード行を追加することができます/ライブラリ
current_directory = File.expand_path("../", __FILE__)
$LOAD_PATH.unshift(current_directory) unless $LOAD_PATH.include?(current_directory)
これはからカレントディレクトリ../
が追加されます現在のファイル__FILE__
, は、それを上記のカレントディレクトリの絶対パスに拡張し、それを既存のロードパスグローバル変数に追加します。例えば内部的には
$ ruby c.rb
hello world
次私は再びあなたのコードを実行すると
If the filename does not resolve to an absolute path, it will be searched for in the directories listed in $LOAD_PATH ($:)
.
-- Kernel's require method
は、だから私は見 絶対パスに指定されていない場合は、ファイル名で検索に使用require
puts $LOAD_PATH
# => ["~/Projects/ruby/stackoverflow_questions/the_scope_of_require",
# "/usr/local/Cellar/rbenv/1.0.0/rbenv.d/exec/gem-rehash",
# "~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/did_you_mean-1.0.0/lib",
# "~/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0",
# "~/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0/x86_64-darwin15",
# "~/.rbenv/versions/2.3.1/lib/ruby/site_ruby",
# "~/.rbenv/versions/2.3.1/lib/ruby/vendor_ruby/2.3.0",
# "~/.rbenv/versions/2.3.1/lib/ruby/vendor_ruby/2.3.0/x86_64-darwin15",
# "~/.rbenv/versions/2.3.1/lib/ruby/vendor_ruby",
# "~/.rbenv/versions/2.3.1/lib/ruby/2.3.0",
# "~/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15"]
注目すべきは、
A file will not be loaded again if its path already appears in $"
. For example, require 'a'; require './a'
will not load a.rb
again.
-- Module: Kernel (Ruby 2_4_0)
require
メソッドのうちの1つが、そのファイルが呼び出されるメソッドの1つになる前に一度発生している限り、それは動作するはずです。ので、あなたの例の両方が
(ディレクトリSITが
$LOAD_PATH
に追加されたり、代わりにrequire_relative
を使用するかのように長い として)動作します答えの一つに指摘したコードにバグがあります。私は要求に '。/'をつけなかった。 –