gpt4 book ai didi

Ruby:在使用该对象遍历列表时删除对象

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:55 25 4
gpt4 key购买 nike

所以我有多个列表来跟踪 2D 游戏中的对象,但如果这些对象离开屏幕,我想删除这些对象,以便它们不再更新。我下面的内容对我有用,但这不适用于其他语言。通常我必须制作另一个“销毁列表”来保存我想要销毁的对象,然后再次循环以删除它们,因为您无法在没有一些可见故障的情况下迭代时从列表中删除对象。

Ruby 是否在执行此操作时没有显示任何可见的故障,或者 Ruby 的数组在仍在迭代时从列表中删除多个可能的对象时工作方式不同?

objects = []

objects.each{|o| o.withinBounds ? o.update : objects.delete(o)}

最佳答案

在 Ruby 中,如果按照您说的去做,您实际上会发现一个故障。

试试这个:

objects = [1,2,3,4]
objects.each { |el| objects.delete(el) }
=> [2, 4]

您可能希望结果是一个空数组,但事实并非如此。我们弄乱了 arr 的元素并且 each 变得困惑,因为数组的长度已经改变。每个迭代器在伪代码中看起来像这样:

count = 0
while length(objects) > count
yield objects[count]
count + 1
end

因此,在我上面显示的示例中,我们得到 [2, 4] 的原因可以通过对 objects.each { |el| 的逐步分析来解释。 objects.delete(el) 正在做:

  1. 我们从 4(对象的长度)> 0 开始。
  2. 产生并删除了 1 号。
  3. 计数 = 1
  4. 3(对象的长度)> 1
  5. 3 号被生成并删除。
  6. 计数 = 2
  7. 2(对象的长度)不大于count
  8. 我们完成了,所以我们有 [2, 4]

通过使用 delete_if 有更好的方法来完成您正在尝试的事情:

new_objects = objects.delete_if {|o| o.withinBounds }

关于Ruby:在使用该对象遍历列表时删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com