开发者

Ruby, including module in current directory

I am currently working through the Well Grounded Rubyist. Great book so far. I am stuck on something I don't quite get with ruby. I have two files

In ModuleTester.rb

class ModuleTester
  include MyFirstModule
end

mt = ModuleTester.new
mt.say_hello

In MyFirstModule.rb

module MyFirstModule
  def say_hello
    puts "hello"
  end
end

When I run 'ruby ModuleTester.rb', I get the following message:

ModuleTester.rb:2:in <class:ModuleTester>': uninitialized constant ModuleTester::MyFirstModule (NameError) from ModuleTester.rb:1:in'

From what I have found online, the current directory isn't in the the namespace, so开发者_如何学C it can't see the file. But, the include statement doesn't take a string to let me give the path. Since the include statement and require statements do different things, I am absolutely lost as to how to get the include statement to recognize the module. I looked through other questions, but they all seem to be using the require statement. Any hints are greatly appreciated.


You use require to load a file, not include. :-)

First, you have to require the file containing the module you want to include. Then you can include the module.

If you're using Rails, it has some magic to automagically require the right file first. But otherwise, you have to do it yourself.


You need to require the file before you can use types defined in it. *

# my_first_module.rb
module MyFirstModule
  def say_hello
    puts 'hello'
  end
end

Note the require at the beginning of the following:

# module_tester.rb
require 'my_first_module'

class ModuleTester
  include MyFirstModule
end

mt = ModuleTester.new
mt.say_hello

The require method actually loads and executes the script specified, using the Ruby VM's load path ($: or $LOAD_PATH) to find it when the argument is not an absolute path.

The include method, on the other hand actually mixes in a Module's methods into the current class. It's closely related to extend. The Well Grounded Rubyist does a great job of covering all this, though, so I encourage you to continue plugging through it.

See the #require, #include and #extend docs for more information.


* Things work a bit differently when using Rubygems and/or Bundler, but getting into those details is likely to confuse you more than it's worth at this point.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜