나는 단순히는 Kernel's require method 이는 a.rb
파일을 찾을 수 없습니다 사용하고 제기 및 LoadError
예외 있음을 말하고있다
$ 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"
을 사용할 수 있으며, 그것은 것입니다 그 a
& b
는 c
파일에 상대적 파일.
아니면 자신의 사용자 정의 스크립트를로드 할 루비 보석에 사용되는 행해지고 있습니다 귀하의 c.rb
파일에 다음 코드 줄을 추가 할 수 있습니다/라이브러리
current_directory = File.expand_path("../", __FILE__)
$LOAD_PATH.unshift(current_directory) unless $LOAD_PATH.include?(current_directory)
이에서 현재 디렉토리 ../
를 추가합니다 현재 파일 __FILE__
, 은 현재 디렉토리의 aboslute 경로가되도록 확장하고 기존로드 경로 전역 변수 에 추가합니다. 예 :내부적으로는
$ 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
메서드 중 하나가 해당 파일이 호출 된 의 메서드 중 하나가 나오기 전에 한 번 발생하면 작동해야합니다. 그래서 당신의 예제 모두 (긴 디렉토리 중 하나로 농성이 $LOAD_PATH
에 추가 또는 당신은 require_relative
대신 사용) 작동에 대한 답변 중 하나에 언급 된 코드에서 버그가
있습니다. 나는 require에'. /'를 추가하지 않았다. –