特定のパスで識別されたファイルをrequire
2回以上呼び出すと、後続の各呼び出しrequire
が返さfalse
れ、ファイルが再評価されないことに注意してください。結果として、他のすべてbase.rb
であるあなた自身がdである場合、それにさらに注意を払うことは再評価につながるべきではありません。require
require
require
例を使ってデモンストレーションしましょう。lib
内部に3つのファイルを含むディレクトリを作成します。
# lib/a.rb
require 'base'
puts :a
# lib/b.rb
require 'base'
puts :b
# lib/base.rb
$counter ||= 0
puts "Evaluated base.rb #{$counter += 1} times"
dir = File.dirname(__FILE__)
path = File.join(dir, '**', '*.rb')
Dir[path].each { |file| require File.expand_path file }
直接実行lib/base.rb
します。base.rb
2回評価されます。1回目は、直接実行されたときです。第二に、それがrequire
によってdであるときa.rb
。から必要な場合は評価されないことに注意してくださいb.rb
。
$ ruby -I lib lib/base.rb
Evaluated base.rb 1 times
Evaluated base.rb 2 times
a
b
それをすることと比較してくださいrequire
。これは、コマンドラインスイッチを使用してファイルdを取得する前にbase.rb
試行されたため、一度だけ評価されrequire
ます。a.rb
b.rb
require
-r
$ ruby -I lib -r base -e 'puts :ok'
Evaluated base.rb 1 times
a
b
ok