2016-05-14 53 views
0

我正在与嵌套模块和红宝石中的这些模块中的类的访问斗争。无法访问嵌套的红宝石模块中的类

我创建了一个简单的示例来显示我的问题。 app.rbtest.rb被放置在同一个文件夹,同时sub_test.rb被放置在称为测试的子文件夹。

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一切正常注释掉测试的执行:: NotWorkingClass

而现在我不明白的奇怪的事情。我修改我的例子在测试文件夹中创建一个名为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

另外,'require's应该(几乎总是)在你的文件的顶部,而不是在你的'module'里面。 –

回答

0

如错误消息所示,test/sub_test.rb找不到Test::NotWorkingClass

你应该测试/ sub_test.rb添加require_relative "../test",并在test.rb

+0

我不喜欢这个解决方案。这是一个简化的例子,但是当我在测试文件夹中有20个文件时,我需要将它们全部包含在app.rb中。但我想要实现的只是在app.rb中只需要一个文件 - 而不是20.因为“测试”应该是我想在不同地方使用的库。没有其他解决方案吗? – PascalTurbo

+0

@PascalTurbo在您的OP中,“require”不正确,如果您不需要“测试”,则子测试不知道“NotWorkingClass”是什么。正如你所说,“测试”是一个库,一个库是你应该在另一个文件中需要的东西。其实,我不明白你的代码逻辑,sub_test做了什么,没有它,代码工作得很好。我不确定为什么你想在app.rb中包含所有测试的文件,但是你可以尝试像'Dir.glob(“test/*。rb”){| f |需要f}'。 – delta

0

删除require_relative 'test/sub_test'那么问题出在哪里了需要声明的。

如果你把require_relative "../test"内部测试/ sub_test.rb它创建循环需要,因为test.rb需要测试/ sub_test.rb

如果你把require_relative "../test"测试/ sub_test.rb内,然后添加require_relative "test/sub_test.rb"内的应用程序。rb然后它会工作