我无法从给定目录导入我需要的所有.rb文件,我知道这个问题已经被问了很多,但是之前的帖子似乎都没有解决我的问题。
这是我的目录结构:
- Docs
- Lexer
- Parser
--> Parser.rb
- SyntaxTree
--> I want all the .rb files from here
--> Sets.rb (Module I want to import)
--> EMPTY_SET (constant I want to reference)
- Test
<Main Program>
我目前在Parser.rb工作,我需要从SyntaxTree目录中获取所有.rb文件,以便我可以在Parser.rb中引用它们。我还想导入Sets.rb中包含的Sets模块。
以下是我目前尝试导入我在之前大多数帖子中看到的所有ruby文件的方法:
Dir['../SyntaxTree/*.rb'].each {|file| require file}
我也尝试过:
Dir['../SyntaxTree/*.rb'].each {|file| require_relative file}
使用这些方法中的任何一种,在尝试包含Sets模块时仍然会出错:
class Parser
include Sets
.
.
end
`<class:Parser>': uninitialized constant Parser::Sets (NameError)
如果我直接包含Sets.rb
错误就会消失
任何想法都会非常有用。
答案 0 :(得分:1)
最好的方法是在模块中设置适当的autoload
依赖项,以便按需加载所需的类。如果您只是使用require
加载所有文件,那么根据文件名加载它们的顺序并不明显,并且任何相互依赖性都无法解决。
这就是为您的应用程序提供顶级命名空间可以提供帮助的原因。例如:
module MyApp
autoload(:Parser, 'my_app/parser')
autoload(:Sets, 'my_app/sets')
end
现在这些类应该按需自动加载。