Ruby,包括当前目录中的模块

时间:2011-07-01 03:43:38

标签: ruby

我目前正在通过Well Grounded Rubyist工作。到目前为止的好书。我被困在一些我不太喜欢红宝石的东西上。我有两个文件

在ModuleTester.rb中

class ModuleTester
  include MyFirstModule
end

mt = ModuleTester.new
mt.say_hello

在MyFirstModule.rb

module MyFirstModule
  def say_hello
    puts "hello"
  end
end

当我运行'ruby ModuleTester.rb'时,我收到以下消息:

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

从我在网上找到的,当前目录不在命名空间中,因此无法看到该文件。但是,include语句不带字符串让我给出路径。由于include语句和require语句做了不同的事情,我绝对迷失了 至于如何让include语句识别模块。我查看了其他问题,但他们似乎都在使用require语句。任何提示都非常感谢。

2 个答案:

答案 0 :(得分:9)

您使用require加载文件,而不是include。 : - )

首先,您必须require包含您想要的模块include的文件。然后你可以include模块。

如果您正在使用Rails,那么首先自动require正确的文件会有一些魔力。但除此之外,你必须自己做。

答案 1 :(得分:1)

您需要require该文件才能使用其中定义的类型。 *

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

请注意以下开头的require

# module_tester.rb
require 'my_first_module'

class ModuleTester
  include MyFirstModule
end

mt = ModuleTester.new
mt.say_hello

require方法实际上加载并执行指定的脚本,使用Ruby VM的加载路径($:$LOAD_PATH)在参数不是绝对路径时找到它。 / p>

另一方面,include方法实际上将Module的方法混合到当前类中。它与extend密切相关。尽管如此,Well Ground的Rubyist可以很好地涵盖所有这些,所以我鼓励你继续完成它。

有关详细信息,请参阅#require#include#extend文档。


*使用Rubygems和/或Bundler时,情况会有所不同,但是进入这些细节可能会让您感到困惑,而不仅仅是它的价值。