Ruby的奇怪行为需要

时间:2014-02-06 00:20:51

标签: ruby gem require

我正在编写一个包含大量嵌套类等的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

仍然不应该是'冲突'。我完全被看似随意的行为所困惑,除非我在语言中做非法行为。我尝试重命名模块,重命名文件,没有骰子。为什么这个文件没有加载?

1 个答案:

答案 0 :(得分:0)

问题来自require在Ruby中的工作方式。每当需要一个文件时(让我们只考虑.rb源文件的情况来保持简单),Ruby会解析该文件并立即执行不在方法中的指令。因此,如果您使用尚未加载的文件中定义的类,Ruby将无法找到它们。

我真的不知道gem作者是否有一种推荐的方式来处理它,但是从C / C ++背景来看,我倾向于明确要求每个源文件中的依赖项,而不是试图在main.rb(或等效的)中维护一个巨大的排序列表。