ruby - 数组中的项目突然不存在

标签 ruby arrays

我通过在子目录中查找所有 .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 返回真值的每个项目(除了falsenil),这将您添加到 ordered_files 的所有文件都是这种情况。

关于ruby - 数组中的项目突然不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426169/

相关文章:

mysql - 在 activerecord 中返回自定义查询选择

javascript - 请解释一下这个函数.reduce是如何工作的

java - 其值是每个其他整数的乘积的数组

c - 在c中初始化指针数组

ruby - Heroku 进程以状态 0 退出,但其测功机仍为 "crashes"

ruby - for循环的用法?

ruby - 如何访问 Ruby 正则表达式中同一匹配组的不同出现?

javascript - 有没有办法在turbolinks.visit(url)之后在选择菜单中显示所选选项值

javascript - 不要显示正确的值 JAVASCRIPT ARRAY

arrays - 在 Fortran 中,如何从数组中删除第 N 个元素?