我是红宝石的首发,我搜索过,如果有人问过类似的问题但是找不到。所以我在这里问。
我正在尝试使用ruby中的模块。
我创建了一个文件夹Project
在Project文件夹中,创建了一个类
class Project::One
include Project::Rest
end
在Project文件夹中,创建了一个模块Rest
module Project::Rest
def display
puts "in display"
end
end
但是当我尝试运行程序(ruby one.rb)时,我得到了
未初始化的常量Project(NameError)
请帮帮我
答案 0 :(得分:3)
问题是你从未真正定义Project
常量。您必须先定义它才能使用它。例如:
# root.rb
module Project
end
require "project/test"
# project/test.rb
class Project::Test
end
然后您应该能够运行ruby root.rb
。另一种方法是在命名空间中声明模块。
# root.rb
require "project/test"
# project/test.rb
module Project
class Test
end
end
通过此示例,您也可以运行ruby project/test.rb
,因为Project
模块已在该文件中定义。
如果您有多个文件定义Project
模块,那也不是问题。它不会被重新定义,它将始终是相同的模块。
这两种方法都将定义Project
模块。但是,简单地说Project::Test
不会定义模块。
作为旁注,Rails有一个自动加载器。如果您使用的是rails应用程序,并使用某种文件夹结构,则会为您定义这些中间模块。但是,如果没有Rails,你必须自己定义它们。
答案 1 :(得分:1)
问题是您没有正确嵌套类/模块。您必须使用module
关键字声明模块,而不仅仅是编写class Project::Class
。假设你有这个结构:
Project/
one.rb
rest.rb
然后你的文件应该是这样的:
# one.rb
require 'rest'
module Project
class One
include Project::Rest
end
end
# rest.rb
module Project
module Rest
def display
puts 'in display'
end
end
end
注意这些模块是如何嵌套的。
答案 2 :(得分:1)
如果您有多个文件中的代码,则必须先加载这些文件,然后才能访问其中的内容。这通常使用require
语句完成。我想你想做的事情应该是这样的:
# one.rb
require 'rest'
module Project
class One
include Rest
end
end
# rest.rb
module Project
module Rest
def display
puts "in display"
end
end
end