我是否正确地说在迭代数组时使用delete_at是危险的?在以下情况下删除后,循环和功能如何退出?
arr.each_index do |i|
if arr[i] == 5
arr.delete_at(i)
return
end
end
答案 0 :(得分:4)
您所谈论的“危险”来自于尝试迭代到您正在修改的数组部分。如果您只执行一次修改,并在此之后立即退出迭代,则没有问题。
当然,你的实际例子可以更简单地完成:
arr.delete_at(arr.index(5))
关于安全问题,如果你反向迭代,通常可以在迭代时删除,这很有用,因为在这种情况下,你正在改变迭代后面的东西,而不是在它之前...... < / p>
答案 1 :(得分:1)
如果你想删除所有5
,而不只是第一个,你可以
new_arr = arr.reject{|x| x == 5}
或者,如果您可以修改现有阵列,
arr.reject!{|x| x == 5}