requireとloadの違い
6月1日
前提として
違い
読み込み回数
requireは同じファイルを何回呼び出しても1回しか読み込まない。
loadは呼び出したら無条件で対象のコードを実行する。
ファイル名補完
requireは拡張子の補完を行ってくれる。対象は
Ruby スクリプト (*.rb) か拡張ライブラリ (*.so,*.o,*.dll など)
loadは拡張子補完を行わないため、完全なファイル名を指定する必要がある。
loadの引数priv
真のとき、ロード・実行は内部的に生成される 無名モジュールをトップレベルとして行われ、 グローバルな名前空間を汚染しません。
loadの引数privの挙動を調べてみた。
code:console
$ ruby -v
$ emacs script.rb
$ cat script.rb
code:script.rb
class Hoge
def initialize hoge
@hoge = hoge
end
def hoge
puts @hoge
end
end
def piyo
puts "PIYO"
end
foo = "foo"
code:console
$ irb
code:irb
load 'script.rb'
=> true
Hoge
=> Hoge
piyo
PIYO
=> nil
foo
NameError (undefined local variable or method `foo' for main:Object)
code:console
$ irb
code:irb
load 'script.rb', true
=> true
Hoge
NameError (uninitialized constant Hoge)
piyo
NameError (undefined local variable or method `piyo' for main:Object)
foo
NameError (undefined local variable or method `foo' for main:Object)
priv = trueだと、読み込んだ先のトップレベルで定義されたクラスやメソッドが呼び出し元でNameErrorになる。