使用之间有什么区别:
require 'digest'
和
load 'digest'
答案 0 :(得分:11)
如果您require
两次使用相同的文件,则只会加载和评估一次。另一方面,load
每次都加载并评估文件。解析实际文件名的方式也有所不同(thanks, 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两次,没有什么不好的事情发生。 <{1}}成功未定义。
bar
但如果我们# main.rb
require './foo'
Foo.instance_methods(false) # => [:bar, :quux]
require './mod'
require './mod'
Foo.instance_methods(false) # => [:quux]
mod.rb两次,那么第二次load
操作将失败,因为方法已经消失:
undef
# 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
只发生一次。当然,这个例子非常人为,但我希望它说明了这一点。