从数组中删除项目需要多次传递才能将其全部删除

我有一个~1200个ruby对象的数组,我想循环它们并删除名称中包含单词或部分单词的对象。

所以我尝试了这个:

list.each do |item| if item.name =~ /cat|dog|rat/i puts item.name list.delete(item) end end 

它的工作原理,除了它似乎错过了一些名称应该匹配的项目。 如果我再次运行它会发现更多,如果我再次运行它会发现更多。 它每次都找不到,但我必须运行它3次才能删除所有内容。

为什么世界会发生这种情况?

那就是你在迭代它时修改底层集合。
基本上,如果集合在迭代期间以某种方式发生变化(变为空,前缀为新元素等),则迭代器没有很多方法来处理它。

请尝试拒绝 。

 list.reject! {|item| item.name =~ /cat|dog|rat/i } 

但还有另一种方法可以做同样的reject! delete

 list.delete_if { |item| item =~ /cat|dog|rat/i }