我有一个~1200个ruby对象的数组,我想循环遍历它们并删除名称中包含单词或部分单词的对象。
所以我尝试了这个:
list.each do |item|
if item.name =~ /cat|dog|rat/i
puts item.name
list.delete(item)
end
end
它有效,但它似乎错过了一些名称应该匹配的项目。如果我再次运行它会发现更多,如果我再次运行它会发现更多。它每次都找不到,但我必须运行它3次才能删除所有内容。
为什么世界会发生这种情况?
答案 0 :(得分:23)
这是你在迭代它时修改底层集合 基本上,如果集合在迭代期间以某种方式发生变化(变为空,前缀为新元素等),迭代器就没有很多方法来处理它。
请尝试reject。
list.reject! {|item| item.name =~ /cat|dog|rat/i }
答案 1 :(得分:0)
但还有另一种方法可以与reject!
delete
进行相同的操作:
list.delete_if { |item| item =~ /cat|dog|rat/i }