使用有什么区别:
require 'digest'
和
load 'digest'
解决方法
如果您需要两次相同的文件,它将只加载和评估一次.另一方面,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
然后,如果我们需要mod.rb两次,没有什么不好的事情发生. bar成功未定义.
# main.rb require './foo' Foo.instance_methods(false) # => [:bar,:quux] require './mod' require './mod' Foo.instance_methods(false) # => [:quux]
但是如果我们加载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>'
要求没有错误,因为在这种情况下,undef只发生一次.当然,这个例子非常人为,但我希望它说明了这一点.