我目前正在通过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语句。任何提示都非常感谢。
答案 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文档。