我正在使用嵌套模块,并在ruby中访问这些模块中的类。
我创建了一个简单的例子来展示我的问题。 app.rb 和 test.rb 放在同一个文件夹中,而 sub_test.rb 放在名为 test的子文件夹中
app.rb
# /app.rb
require_relative 'test.rb'
Test::NotWorkingClass.work
test.rb
# /test.rb
module Test
require_relative 'test/sub_test'
class NotWorkingClass
def self.work
puts 'Test::NotWorkingClass.work'
end
end
end
测试/ sub_test.rb
# /test/sub_test.rb
module Test
module SubTest
Test::NotWorkingClass.work
end
end
执行应用程序时出现此错误:
/test/sub_test.rb:3:in `<module:SubTest>': uninitialized constant Test::NotWorkingClass (NameError)
当我在 sub_test.rb 中注释掉 Test :: NotWorkingClass 的执行时,一切正常。
现在奇怪的是我不明白。我通过在 test 文件夹中创建名为 not_working_class.rb 的文件修改了我的示例,并将其包含在test.rb文件中:
test.rb
# /test.rb
module Test
require_relative 'test/not_working_class'
require_relative 'test/sub_test'
end
测试/ not_working_class.rb
# /test/not_working_class.rb
module Test
class NotWorkingClass
def self.work
puts 'Test::NotWorkingClass.work'
end
end
end
现在,这个例子有效。
那么为什么我不能访问test.rb文件中定义的类,但是在单独的文件中定义时可以访问它们?
答案 0 :(得分:0)
正如错误消息所示, test / sub_test.rb 找不到Test::NotWorkingClass
。
您应该在 test / sub_test.rb 中添加require_relative "../test"
,然后移除 test.rb中的require_relative 'test/sub_test'
答案 1 :(得分:0)
问题在于require语句位于。
如果将require_relative "../test"
放在test / sub_test.rb中,则会创建循环require,因为test.rb需要test / sub_test.rb
如果你将require_relative "../test"
置于test / sub_test.rb中,然后在app.rb中添加require_relative "test/sub_test.rb"
,那么它将会正常工作