Search code examples
rubyruby-1.9.2

load works on local path, require doesn't


loadee.rb

puts '> This is the second file.'

loaddemo.rb

puts 'This is the first (master) program file.'
load 'loadee.rb'
puts 'And back again to the first file.'

When I run "ruby loaddemo.rb", This works fine. Both files are in the same directory, and that's the directory I run from.

But if I change the load to a require, and with or without the extension I get:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load
 -- loadee.rb (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from loaddemo.rb:2:in `<main>'

My question is of course, why isn't require working in this case? It should, right? Do load and require use different paths?

Ruby version 1.9.2


Solution

  • If you provide just a filename to require, it will only look in the predefined $LOAD_PATH directories. However, if you provide a path with your filename, it should work:

    puts 'This is the first (master) program file.'
    require './loadee.rb'
    puts 'And back again to the first file.'
    

    You could also add your project's folder to the load path instead:

    $LOAD_PATH.unshift File.dirname(__FILE__)
    puts 'This is the first (master) program file.'
    require 'loadee.rb'
    puts 'And back again to the first file.'
    

    And last, you could just use require_relative instead:

    puts 'This is the first (master) program file.'
    require_relative 'loadee.rb'
    puts 'And back again to the first file.'