我正在研究非铁轨红宝石项目。项目结构如下所示:
var obj = {
one: 1,
two: {
three: 3
},
four: {
five: 5,
six: {
seven: 7
},
eight: 8
},
nine: 9
};
function deepFind(obj, path) {
var paths = path.split('.')
, current = obj
, i;
for (i = 0; i < paths.length; ++i) {
if (current[paths[i]] == undefined) {
return undefined;
} else {
current = current[paths[i]];
}
}
return current;
}
console.log(deepFind(obj, 'four.six.seven'))
app.rb中的我有类似下面的内容:
--Root
-Base
-xyz_base.rb
-abc_base.rb
-Entities
-A
-base
-a_base.rb
-a.rb
-B
-b.rb
-C
-c.rb
-app.rb
因此,所有文件都包含在项目中(Dir['./**/'].each {|dir| $:.push dir}
Dir["./**/*.rb"].each {|rb| require rb}
,abc_base.rb
,...)。
a.rb
之前需要a_base.rb
。但是,在行动中,它首先需要a.rb
,而a.rb
我需要a_base.rb
或uninitialized constant Entities::A::Base (NameError)
。
我调查了cannot load such file
,autoload
gem。另一种解决方案是将每个文件中的require放在仅需要的文件中。但文件太多了。
有什么想法吗?
答案 0 :(得分:0)
如果您知道您将在整个项目中使用此命名约定 - 并且不想使用您提出的解决方案(明确要求a_base) - 您可以执行类似以下操作:
Dir.glob("**/[a-z].rb").each do |file|
m = /(.+)\.rb/.match(file)
require_relative "#{m[1]}_base.rb" # entities/a/a_base.rb
require_relative file
end