8

使用の違いは何ですか:

require 'digest'

load 'digest'
4

1 に答える 1

12

同じファイルを 2 回読み込んだ場合require、そのファイルは 1 回だけ読み込まれ、評価されます。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 を 2 回実行しても、悪いことは何も起こりません。bar正常に未定義になります。

# main.rb
require './foo'

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

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

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

しかし、loadmod.rb を 2 回undef実行すると、メソッドが既になくなっているため、2 回目の操作は失敗します。

# 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 に答える