當我嘗試運行你的代碼,我得到了以下錯誤消息
$ 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>'
這只不過是說,它採用了Kernel's require method 無法找到a.rb
文件,然後引發和LoadError
例外。
爲了所需要的文件,你可以使用Kernal's require_relative
method
require_relative "a"
require_relative "b"
,它會那些a
& b
文件相對c
文件。
或者你可以將下面的代碼行添加到您的c.rb
文件,它是用Ruby寶石用來加載自己的自定義腳本 常見的約定/庫
current_directory = File.expand_path("../", __FILE__)
$LOAD_PATH.unshift(current_directory) unless $LOAD_PATH.include?(current_directory)
這將增加當前目錄../
從當前文件__FILE__
, 將其擴展爲所述當前目錄的aboslute路徑,並將其添加到現有Load Path全局變量的 ;例如
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"]
其中require
內部使用的文件名,找到,如果它沒有給出 絕對路徑
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
所以,當我再次運行你的代碼,我看到下面的
$ ruby c.rb
hello world
應該注意的是,
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
方法之一出現在 這個文件被調用的方法之一之前,它就應該工作;所以您的兩個例子就可以了(如 只要任一目錄下的仰臥被添加到$LOAD_PATH
或使用 require_relative
代替)
有代碼的答案中的一個注意到的錯誤。我沒有爲需求添加'。/'。 –