无法访问嵌套ruby模块中的类

时间:2016-05-14 15:46:50

标签: ruby class module nested

我正在使用嵌套模块,并在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文件中定义的类,但是在单独的文件中定义时可以访问它们?

2 个答案:

答案 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",那么它将会正常工作