2016-05-14 2 views
0

Ich kämpfe mit verschachtelten Modulen und den Zugriff auf Klassen in diesen Modulen in Ruby.In verschachtelten Ruby-Modulen kann nicht auf die Klasse zugegriffen werden

Ich habe ein einfaches Beispiel erstellt, um mein Problem zu zeigen. app.rb und test.rb werden im selben Ordner platziert, während sub_test.rb in einem Unterordner Test genannt platziert wird.

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 

test/sub_test.rb

# /test/sub_test.rb 
module Test 
    module SubTest 
    Test::NotWorkingClass.work 
    end 
end 

Wenn die Ausführung app Ich erhalte diese Fehlermeldung:

/test/sub_test.rb:3:in `<module:SubTest>': uninitialized constant Test::NotWorkingClass (NameError) 

Als ich aus der Durchführung von Test-kommentiert :: NotWorkingClass in sub_test.rb alles funktioniert.

Und jetzt die seltsame Sache, die ich nicht verstanden habe. Ich veränderte mein Beispiel durch eine Datei not_working_class.rb in Test Ordner namens Erstellen und schließen sie in den test.rb Datei:

test.rb

# /test.rb 
module Test 
    require_relative 'test/not_working_class' 
    require_relative 'test/sub_test' 
end 

Test/not_working_class. rb

# /test/not_working_class.rb 
module Test 
    class NotWorkingClass 
    def self.work 
     puts 'Test::NotWorkingClass.work' 
    end 
    end 
end 

Und jetzt funktioniert das Beispiel.

Warum kann ich nicht auf Klassen zugreifen, die in der Datei test.rb definiert sind, kann aber auf sie zugreifen, wenn sie in einer separaten Datei definiert sind?

+0

Als nebenbei, 'require' sollte (fast immer) an der Spitze Ihrer Datei gehen, nicht in Ihrem' Modul'. –

Antwort

0

Wie die Fehlermeldung suggeriert, kann test/sub_test.rbTest::NotWorkingClass nicht finden.

Sie sollten require_relative "../test" in Test/sub_test.rb, hinzufügen und die require_relative 'test/sub_test' in test.rb

+0

Ich mag diese Lösung nicht. Es ist ein vereinfachtes Beispiel, aber wenn ich 20 Dateien im Testordner hätte, müsste ich alle in app.rb einschließen. Aber was ich erreichen möchte, ist, nur eine Datei in app.rb zu benötigen - nicht 20. Weil der "Test" eine Bibliothek sein soll, die ich an verschiedenen Orten verwenden möchte. Gibt es keine andere Lösung? – PascalTurbo

+0

@PascalTurbo In Ihrem OP ist das "require" nicht richtig, der Untertest hat keine Ahnung was "NotWorkingClass" ist, wenn Sie "test" nicht benötigen. Wie Sie sagten, ist "test" eine Bibliothek, eine Bibliothek ist etwas, das Sie in einer anderen Datei benötigen. Eigentlich verstehe ich deine Code Logik hier nicht, was macht sub_test, ohne sie funktioniert der Code einwandfrei. Ich bin nicht sicher, warum Sie alle zu testenden Dateien in app.rb einschließen möchten, aber Sie können versuchen, etwas wie 'Dir.glob (" test/*. Rb ") {| f | require f} '. – delta

0

So das Problem entfernen ist, wo die Anweisung erforderlich ist.

Wenn Sie require_relative "../test" innerhalb Probe gestellt/sub_test.rb es schafft Kreis erfordern, weil test.rb Test erfordert/sub_test.rb

Wenn Sie require_relative "../test" innerhalb Test/sub_test.rb setzen und dann require_relative "test/sub_test.rb" innerhalb App hinzufügen.rb dann wird es funktionieren

Verwandte Themen