gpt4 book ai didi

Ruby 类变量以意想不到的方式运行

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:24 24 4
gpt4 key购买 nike

我有一个收集所有实例变量的类变量。它还具有获取和删除它们的方法。

module Somemodule
class Widget
@@widgets = []
def initialize
...
@@widgets << self
end
def self.all
@@widgets
end
def delete
@@widgets.delete(self)
end
end
end

在我的代码中,有时我想删除小部件。

module Somemodule
def self.delete_bad_widgets
Widget.all.each do |widget|
if widget.bad
widget.delete
end
end
end
end

问题是这并没有删除所有坏的小部件。如果我之后调用 Widget.all,我仍然可以看到坏的小部件。任何人都知道发生了什么事?我正在运行 Ruby 2.2.1。

谢谢

编辑:总共有大约 4500 个小部件,代码更改了它们几次。但是我仍然可以运行类似下面的东西(在相同的 delete_bad_widgets 方法中!)并且仍然看到坏的小部件:

Widget.all.each {|w| pp w if w.bad}

最佳答案

如果您在 each 期间删除条目,它会影响循环。

看看这个例子:

a = [1,2,3,4,5,6,7]

p a
a.each{|x|
p x
a.delete(x) if x == 3
}
p a

结果:

  [1, 2, 3, 4, 5, 6, 7]
1
2
3
5
6
7
[1, 2, 4, 5, 6, 7]

条目 4 未打印!每个循环保留索引,但序列随着您的删除而改变。

我建议实现类方法 delete_baddelete_if

关于Ruby 类变量以意想不到的方式运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30492275/

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