使用Ruby在数组循环中使用delete_at
我说的在遍历数组时使用delete_at是危险的,对吗?在删除后退出循环和函数的以下情况下如何使用Ruby在数组循环中使用delete_at,ruby,arrays,loops,Ruby,Arrays,Loops,我说的在遍历数组时使用delete_at是危险的,对吗?在删除后退出循环和函数的以下情况下如何 arr.each_index do |i| if arr[i] == 5 arr.delete_at(i) return end end 您所说的“危险”来自于尝试迭代您正在修改的数组部分。如果您只执行一次修改,然后立即退出迭代,那么就没有问题了 当然,您的实际示例可以做得更简单: arr.delete_at(arr.index(5)) 在安全问题上,认识到如果你反向迭代,
arr.each_index do |i|
if arr[i] == 5
arr.delete_at(i)
return
end
end
您所说的“危险”来自于尝试迭代您正在修改的数组部分。如果您只执行一次修改,然后立即退出迭代,那么就没有问题了
当然,您的实际示例可以做得更简单:
arr.delete_at(arr.index(5))
在安全问题上,认识到如果你反向迭代,你通常可以在迭代时删除,这很有用,因为在这种情况下,你在迭代后而不是在迭代前更改内容…如果你想删除所有
5
s,而不仅仅是第一个,你可以这样做
new_arr = arr.reject{|x| x == 5}
或者,如果可以修改现有阵列
arr.reject!{|x| x == 5}
为什么只想删除第一个
5
,而不是全部?5实际上是数据库中多次存在的地名。检测到重复项后,将根据用户选择将其删除并替换为更具体的名称。然后重新提交,以便进一步澄清重复的地名。我只想一次做一个,因为每次只要求用户澄清一个地名。希望这是有道理的。不确定你的例子和我的一样吗?因为我只想在退出之前删除第一次出现的5arr.index(5)
查找前5个的位置,然后arr.delete_at
仅删除该位置的元素。不要将其与arr.delete(5)
混淆,后者将删除所有5s。在迭代时删除并不好,因为在当前位置后删除会导致跳过下一个位置。