我通过在子目录中查找所有 .rb 文件,然后迭代以将它们全部加载来动态加载文件。两个文件必须按特定顺序加载。
1.info.rb
必须首先加载
2.main.rb
必须在最后加载
这是我的代码
TO_MOVE = %w(main info)
Dir.chdir(File.dirname(File.realpath(__FILE__))){
file_list = Dir.glob('**/*.rb') - IGNORE_LIST
file_list.each_with_index { |p,pi| puts "#{pi}:#{p}" }
puts '-----------'
file_list.each_with_index do |path,pi|
puts "#{pi}:#{file_list[pi]}"
if TO_MOVE.include?(file = File.basename(path, ".rb"))
ordered_files[file.to_sym] = file_list.delete_at(pi)
end
end
}
这是问题所在,我正在打印它打印出来的 file_list
数组,如下所示:
0:gem_name/data/data.rb
1:gem_name/helpers/helpers.rb
2:gem_named/info.rb
3:gem_name/main.rb
4:gem_name/routing/actions.rb
5:gem_name/routing/api.rb
正如我所期望的,但是当它第二次打印时,它打印出来是这样的:
0:gem_name/data/data.rb
1:gem_name/helpers/helpers.rb
2:gem_name/info.rb
3:gem_name/routing/actions.rb
4:gem_name/routing/api.rb
main.rb 在哪里?为什么它突然不存在了?
因此,它跳过了 main,并且由于它这样做了,所以找不到 main 并将其移动到我正在执行的列表的末尾
ordered_files[:main] = file_list.delete_at(4)
但是当 main 没有在索引 4 处加载时,它就停止工作了,我需要比修补作业更好的东西。
为什么 main.rb 被跳过?我真的对此感到困惑。我知道它存在,因为它在尝试加载 main.rb
时出错,因为之前应该加载的模块没有被加载,所以模块不存在(这就是它出错的原因),这这就是为什么 main.rb
需要在最后加载。
如果您想知道放置有序文件的代码如下所示:
file_list.unshift(ordered_files[:info]) << ordered_files[:main]
最佳答案
发生这种情况是因为您在迭代列表时从列表中删除了项目:
ordered_files[file.to_sym] = file_list.delete_at(pi)
以下是发生情况的示例:
arr = [0, 1, 2, 3, 4, 5]
arr.each_with_index do |n, i|
puts "#{n}, #{i}"
arr.delete_at(i) if i == 2
end
将输出:
0, 0
1, 1
2, 2
4, 3
5, 4
如果您想删除添加到 ordered_files
的所有文件,我认为使用 reject!
效果会更好:
file_list.reject! do |path|
puts "#{path]}"
if TO_MOVE.include?(file = File.basename(path, ".rb"))
ordered_files[file.to_sym] = path
end
end
这告诉file_list
删除该 block 返回真值的每个项目(除了false
或nil
),这将您添加到 ordered_files
的所有文件都是这种情况。
关于ruby - 数组中的项目突然不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426169/