简单的Ruby循环数组不会完全迭代

时间:2014-04-16 15:44:35

标签: ruby arrays

所以我认为我理解这一点,但我没有得到我预期的输出,所以很明显我不理解它。

在Ruby(2.0.0)中

a = [1,2,3,4]
a.each do |e|
    a.delete(e)
end
a = [2,4]

它似乎没有循环遍历数组中的每个项目。但是,当我只输出项目时,它会遍历每个项目。 a.delete(e)的某些机制正在影响迭代。

a = [1,2,3,4]
a.each do |e|
    puts e
end
=> 1
=> 2
=> 3
=> 4

最终,我想在循环中加入一个条件,例如:

a = [1,2,3,4]
a.each do |e|
    if e < 3
        a.delete(e)
    end
end

如何通过迭代每个项目并删除它来获取此循环?谢谢!

2 个答案:

答案 0 :(得分:6)

当你迭代它时,不要改变一个集合,除非你知道你在做什么

为了终极目的,

a = [1,2,3,4]
a.reject!{|e| e < 3 }

答案 1 :(得分:3)

使用

a = [1,2,3,4]
a.each do |e|
  a.delete(e)
end
a # => [2, 4]

第一次迭代位于索引0e1。删除后,a变为[2,3,4],下一次迭代位于索引1e3。删除后,a变为[2,4]。下一次迭代将在索引2,但由于a不再那么长,它会停止,将a的值返回为[2, 4]

为了迭代每个项目并删除它,假设没有重复,一种常见的方法是向后迭代。

a = [1,2,3,4]
a.reverse_each do |e|
  a.delete(e)
end
a # => []

a = [1,2,3,4]
a.reverse_each do |e|
  if e < 3
    a.delete(e)
  end
end
a # => [3, 4]