【发布时间】:2013-02-01 13:19:31
【问题描述】:
使用有什么区别:
require 'digest'
和
load 'digest'
【问题讨论】:
-
这个SO post清楚地解释了require和load之间的区别。
-
我认为answer below 更清晰。
标签: ruby-on-rails ruby
使用有什么区别:
require 'digest'
和
load 'digest'
【问题讨论】:
标签: ruby-on-rails ruby
如果你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 。你说的消失到底是什么意思?
load 'mod.rb' 的一部分的“方法栏”到底发生了什么,这使得第二个问题load 'mod.rb' 抛出错误说 undefined method bar ?