【问题标题】:Ruby loop skipping elementsRuby 循环跳过元素
【发布时间】:2012-03-02 12:30:21
【问题描述】:

我有这个:

puts pids
pids.each do |pid|
    puts "Running on pid #{pid}"
    begin
        Process::kill(0, pid)
        puts "Pid #{pid} still alive"
    rescue Errno::ESRCH
        puts "Pid #{pid} now dead!!!!"
        pids.delete(pid)
        running_jobs -= 1
        puts "Remaining jobs: #{running_jobs}"
    end
end

输出这个:

25555
25579
25616
Running on pid 25555
Pid 25555 now dead!!!!
Remaining jobs: 2
Running on pid 25616
Pid 25616 now dead!!!!
Remaining jobs: 1    

如您所见,循环永远不会在中间元素上执行。谁能告诉我为什么会这样?我真的需要遍历每个项目并相应地处理它。

【问题讨论】:

  • 您不想在迭代同一个集合时删除集合中的元素。 (我认为这在大多数编程语言中通常是正确的。)除了@klochner 关于您的具体情况的帖子之外,请参阅这些帖子以了解在 Ruby 中从数组中删除所选项目的其他方法:stackoverflow.com/questions/3260686/…stackoverflow.com/questions/2933366/…跨度>
  • 出于某种原因,我觉得我已经能够在我编写的其他程序中做到这一点。稍后我将不得不试一试。我是 Ruby 新手,感谢您的帮助。

标签: ruby


【解决方案1】:

当你用pids.delete(pid) 迭代数组时,你正在改变数组所以你在索引0 的25555 上,然后你删除它,导致数组看起来像[25579, 25616]。然后您进行迭代,现在您位于索引 1,即 25616。如果您只是删除删除,您将不再对数组进行变异,并且迭代将按预期工作。

【讨论】:

    【解决方案2】:

    例如,您的循环位于第 5 项上,然后您将其删除。项目 6、7 等向上移动 1,当您的循环转到项目 6 的位置时,它会找到项目 7。

    但是说你不能在迭代数组时改变你的数组有点陈词滥调。如果您只需将您的each 替换为reverse_each,您就可以完全保留您的代码。这会从头到尾遍历数组,所以现在当您删除第 5 项时,向上移动 6 并不重要,因为接下来您将前往 4,而且(还)没有改变。

    【讨论】:

      【解决方案3】:

      您不能在迭代数组时对其进行变异 - 只需删除这一行:

      pids.delete(pid)
      

      从您的代码来看,您可能希望像这样重构以模拟delete 调用:

      pids = pids.select do |pid|
        puts "Running on pid #{pid}"
        begin
            Process::kill(0, pid)
            puts "Pid #{pid} still alive"
            true
        rescue Errno::ESRCH
            puts "Pid #{pid} now dead!!!!"
            running_jobs -= 1
            puts "Remaining jobs: #{running_jobs}"
            false
        end
      end
      

      【讨论】:

      • 为什么会导致某些项目被跳过?它应该只从数组中删除当前的 pid。我希望该数组是我正在尝试跟踪的 pid 的最新列表,并且我不想让一堆自重在那里漂浮。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2018-05-31
      • 2017-07-11
      相关资源
      最近更新 更多