在Ruby的数组循环中使用delete_at

时间:2011-02-22 08:34:56

标签: ruby arrays loops

我是否正确地说在迭代数组时使用delete_at是危险的?在以下情况下删除后,循环和功能如何退出?

arr.each_index do |i|
  if arr[i] == 5
    arr.delete_at(i)
    return
  end
end

2 个答案:

答案 0 :(得分:4)

您所谈论的“危险”来自于尝试迭代到您正在修改的数组部分。如果您只执行一次修改,并在此之后立即退出迭代,则没有问题。

当然,你的实际例子可以更简单地完成:

arr.delete_at(arr.index(5))

关于安全问题,如果你反向迭代,通常可以在迭代时删除,这很有用,因为在这种情况下,你正在改变迭代后面的东西,而不是在它之前...... < / p>

答案 1 :(得分:1)

如果你想删除所有5,而不只是第一个,你可以

new_arr = arr.reject{|x| x == 5}

或者,如果您可以修改现有阵列,

arr.reject!{|x| x == 5}