What is the difference between require and load?

ruby, ruby-on-rails

Solution

If you `require` the same file twice, it will be loaded and evaluated only once. `load`, on the other hand, loads and evaluates the file every time. There are also differences in how actual filename is resolved (thanks, Saurabh).

What does this mean practically?

Let's say we have a library `foo`

# foo.rb

class Foo
  def bar
    puts 'bar'
  end
  
  def quux
    puts 'quux'
  end
end

Then we have a file which makes some non-idempotent operations. Say, undefines a method

# mod.rb
class Foo
  undef :bar
end

Then, if we `require` mod.rb twice, nothing bad happens. `bar` gets successfully undefined.

# main.rb
require './foo'

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

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

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

But if we `load` mod.rb twice, then second `undef` operation will fail, because method is already gone:

# 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>'

There's no error with `require` because in that case `undef` happens only once. Granted, this example is quite contrived, but I hope it illustrates the point.

Problem

What is the difference between using: ``` require 'digest' ``` and ``` load 'digest' ```

Original source

Related problems