require和load有什么区别?

时间:2013-02-01 13:19:31

标签: ruby-on-rails ruby

使用之间有什么区别:

require 'digest'

load 'digest'

1 个答案:

答案 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只发生一次。当然,这个例子非常人为,但我希望它说明了这一点。