使用の違いは何ですか:
require 'digest'
と
load 'digest'
同じファイルを 2 回読み込んだ場合require
、そのファイルは 1 回だけ読み込まれ、評価されます。load
一方、毎回ファイルをロードして評価します。実際のファイル名が解決される方法にも違いがあります ( Saurabh に感謝します)。
ライブラリがあるとしましょうfoo
# foo.rb
class Foo
def bar
puts 'bar'
end
def quux
puts 'quux'
end
end
次に、冪等でない操作を行うファイルがあります。たとえば、メソッドを未定義にします
# mod.rb
class Foo
undef :bar
end
次に、require
mod.rb を 2 回実行しても、悪いことは何も起こりません。bar
正常に未定義になります。
# main.rb
require './foo'
Foo.instance_methods(false) # => [:bar, :quux]
require './mod'
require './mod'
Foo.instance_methods(false) # => [:quux]
しかし、load
mod.rb を 2 回undef
実行すると、メソッドが既になくなっているため、2 回目の操作は失敗します。
# main.rb
require './foo'
Foo.instance_methods(false) # => [:bar, :quux]
load 'mod.rb'
load 'mod.rb'
Foo.instance_methods(false) # =>
# ~> mod.rb:2:in `<class:Foo>': undefined method `bar' for class `Foo' (NameError)
# ~> from mod.rb:1:in `<top (required)>'
# ~> from -:6:in `load'
# ~> from -:6:in `<main>'
require
その場合は一度だけ発生するため、エラーはありませんundef
。確かに、この例は非常に不自然ですが、要点を示していることを願っています。