所以我认为我理解这一点,但我没有得到我预期的输出,所以很明显我不理解它。
在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
如何通过迭代每个项目并删除它来获取此循环?谢谢!
答案 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]
第一次迭代位于索引0
,e
为1
。删除后,a
变为[2,3,4]
,下一次迭代位于索引1
,e
为3
。删除后,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]