【发布时间】:2015-09-26 11:30:21
【问题描述】:
在通过each 对其进行迭代时,是否可以安全地从Array 中删除元素?第一个测试看起来很有希望:
a = (1..4).to_a
a.each { |i| a.delete(i) if i == 2 }
# => [1, 3, 4]
但是,我在以下方面找不到确凿的事实:
- 是否安全(按设计)
- 从哪个 Ruby 版本开始是安全的
在过去的某些时候,似乎是not possible to do:
它不起作用,因为 Ruby 在尝试删除某些内容时退出了
.each循环。
documentation 没有说明迭代期间的可删除性。
我不是在寻找 reject 或 delete_if。我想对数组的元素做一些事情,有时还从数组中删除一个元素(在我对所述元素做了其他事情之后)。
更新 1:我对“安全”的定义不是很清楚,我的意思是:
- 不要引发任何异常
- 不要跳过
Array中的任何元素
【问题讨论】:
-
在我熟悉的所有语言中都不安全(取决于您如何定义“安全”)。在迭代集合时修改集合肯定会破坏您的程序或让您感到惊讶。想不出一个合法的用例。
-
为了安全起见,迭代数组的副本,同时从原始元素中删除元素