需要基于祖先的所有文件

时间:2016-09-17 13:27:28

标签: ruby autoload

我正在研究非铁轨红宝石项目。项目结构如下所示:

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.rbuninitialized constant Entities::A::Base (NameError)

我调查了cannot load such fileautoload gem。另一种解决方案是将每个文件中的require放在仅需要的文件中。但文件太多了。

有什么想法吗?

1 个答案:

答案 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