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?
Als nebenbei, 'require' sollte (fast immer) an der Spitze Ihrer Datei gehen, nicht in Ihrem' Modul'. –