特定のパスで識別されたファイルをrequire2回以上呼び出すと、後続の各呼び出しrequireが返さfalseれ、ファイルが再評価されないことに注意してください。結果として、他のすべてbase.rbであるあなた自身がdである場合、それにさらに注意を払うことは再評価につながるべきではありません。requirerequirerequire
例を使ってデモンストレーションしましょう。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.rb2回評価されます。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.rbb.rbrequire-r
$ ruby -I lib -r base -e 'puts :ok'
Evaluated base.rb 1 times
a
b
ok