Reputation: 51
I am confused about the difference between load 'file.rb'
and require 'Module'
. At Learn Ruby the Hard Way, the example of how to use a module is set up with two files (mystuff.rb
and apple.rb
):
mystuff.rb
module MyStuff
def MyStuff.apple()
puts "I AM APPLES!"
end
end
apple.rb
require 'mystuff'
MyStuff.apple()
However, when I run apple.rb
, either in the Sublime Text console, or with ruby apple.rb
, I get a Load Error
. I have also tried require 'MyStuff'
, and require 'mystuff.rb'
, but I still get the Load Error
.
So, I switched the first line of apple.rb
to load 'mystuff.rb'
, which allows it to run. However, if I edit 'mystuff.rb'
to be a definition of class MyStuff
as opposed to a module MyStuff
, there is no difference.
For reference, the Load Error
is:
/Users/David/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in
require': cannot load such file -- mystuff (LoadError)`
I've peeked into kernel_require.rb
and looked at the require
definition, but since I'm a Ruby Nuby (indeed, a programming newbie), it was a little overwhelming. Since Learn Ruby the Hard Way hasn't been updated since 2012-10-05, there've probably been some syntax changes for modules. Yes?
Upvotes: 2
Views: 276
Reputation: 3034
You can solve this easily by changing
require 'mystuff'
to
require_relative './mystuff'
Upvotes: 2
Reputation: 29389
require
searches a pre-defined list of directories, as discussed in What are the paths that "require" looks up by default?. It's failing because it can't find the mystuff.rb
in any of those directories.
load
, on the other hand, will look for files in the current directory.
As for:
However, if I edit 'mystuff.rb' to be a definition of class MyStuff as opposed to a module MyStuff, there is no difference.
I'm not sure I understand what you mean by "no difference". If you mean that the require
and load
continue to fail and succeed, respectively, that makes sense, as the require
failure is independent of the content of the file contents and the code you're testing behaves the same independent of whether Mystuff is a class or a vanilla module.
Upvotes: 4