我正在编写一个包含大量嵌套类等的Ruby gem。我想在require
目录中保留我的主要Ruby文件中的/lib
语句的大量列表,所以我使用了以下内容:
Dir[ File.join( File.dirname(__FILE__), "**", "*.rb" ) ].each {|f| require f}
直到今天早上我添加了一个新文件(帮助程序模块)时才完全正常工作,现在该文件就像没有加载那个文件一样,即使它是。我检查了
puts "loaded" if defined?(RealtimeArgHelpers)
我还复制了require语句来检查我的新文件是否被返回
Dir[ File.join( File.dirname(__FILE__), "**", "*.rb" ) ].each {|f| puts f}
它是。我必须手动要求这个文件。从哪儿冒出来。我这个声明目前正在收集101个其他文件,一切正常。但不是这一个文件。除了
之外,我没有任何名称冲突/path/arg_helpers.rb
/path/realtime/agents.rb
/path/realtime/queues.rb
/path/realtime.rb
/path/realtime_arg_helpers.rb
仍然不应该是'冲突'。我完全被看似随意的行为所困惑,除非我在语言中做非法行为。我尝试重命名模块,重命名文件,没有骰子。为什么这个文件没有加载?
答案 0 :(得分:0)
问题来自require
在Ruby中的工作方式。每当需要一个文件时(让我们只考虑.rb源文件的情况来保持简单),Ruby会解析该文件并立即执行不在方法中的指令。因此,如果您使用尚未加载的文件中定义的类,Ruby将无法找到它们。
我真的不知道gem作者是否有一种推荐的方式来处理它,但是从C / C ++背景来看,我倾向于明确要求每个源文件中的依赖项,而不是试图在main.rb(或等效的)中维护一个巨大的排序列表。