Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby在数组循环中使用delete_at_Ruby_Arrays_Loops - Fatal编程技术网

使用Ruby在数组循环中使用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)) 在安全问题上,认识到如果你反向迭代,

我说的在遍历数组时使用delete_at是危险的,对吗?在删除后退出循环和函数的以下情况下如何

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实际上是数据库中多次存在的地名。检测到重复项后,将根据用户选择将其删除并替换为更具体的名称。然后重新提交,以便进一步澄清重复的地名。我只想一次做一个,因为每次只要求用户澄清一个地名。希望这是有道理的。不确定你的例子和我的一样吗?因为我只想在退出之前删除第一次出现的5
arr.index(5)
查找前5个的位置,然后
arr.delete_at
仅删除该位置的元素。不要将其与
arr.delete(5)
混淆,后者将删除所有5s。在迭代时删除并不好,因为在当前位置后删除会导致跳过下一个位置。