【问题标题】:What is the difference between require and load?需求和负载有什么区别?
【发布时间】:2013-02-01 13:19:31
【问题描述】:

使用有什么区别:

require 'digest'

load 'digest'

【问题讨论】:

  • 这个SO post清楚地解释了require和load之间的区别。
  • 我认为answer below 更清晰。

标签: ruby-on-rails ruby


【解决方案1】:

如果你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 两次,就不会发生任何不好的事情。 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 只发生一次。诚然,这个例子很做作,但我希望它能说明这一点。

【讨论】:

  • 你能解释一下这一行吗:- But if we load mod.rb twice, then second undef operation will fail, because method is already gone 。你说的消失到底是什么意思?
  • “gone”表示“未定义”、“不再存在”、“不存在”。
  • 很抱歉,如果我之前的问题不是那么精确。我试图了解作为第一个 load 'mod.rb' 的一部分的“方法栏”到底发生了什么,这使得第二个问题load 'mod.rb' 抛出错误说 undefined method bar ?
  • @boddhisattva:嗯,它是未定义的。从存在中删除。当我们第二次加载“mod.rb”时,它会尝试取消定义不存在的方法。因此出现错误。
  • 谢谢,这澄清了我的疑问:)
猜你喜欢
  • 2014-03-30
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多