使用有什么区别:
require 'digest'
和
load 'digest'
如果您require
两次使用相同的文件,它将仅加载和评估一次。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 两次,没有什么不好的事情发生。bar
成功未定义。
# main.rb
require './foo'
Foo.instance_methods(false) # => [:bar, :quux]
require './mod'
require './mod'
Foo.instance_methods(false) # => [:quux]
但是如果我们load
mod.rb 两次,那么第二次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
因为在这种情况下undef
只发生一次。诚然,这个例子是相当做作的,但我希望它能说明这一点。