8

使用有什么区别:

require 'digest'

load 'digest'
4

1 回答 1

12

如果您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

然后,如果我们requiremod.rb 两次,没有什么不好的事情发生。bar成功未定义。

# main.rb
require './foo'

Foo.instance_methods(false) # => [:bar, :quux]

require './mod'
require './mod'

Foo.instance_methods(false) # => [:quux]
            
            

但是如果我们loadmod.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只发生一次。诚然,这个例子是相当做作的,但我希望它能说明这一点。

于 2013-02-01T13:20:53.370 回答