gpt4 book ai didi

ruby - 如何计算 ruby​​ 中某个类的现有实例?

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

这是来自 this question 的想法:创建对象后,增加一个类变量。当收集对象时,将其递减。如您所见,终结器被调用,@@no_foo 被递减。但是当我稍后查询时,减量消失了。似乎值(value)只会上升,不会下降(如果我创建两个对象,它将显示 2)。我是否遗漏了一些明显的东西?

class Foo
@@no_foo = 0

def initialize
puts 'creating object'
@@no_foo += 1
ObjectSpace.define_finalizer(self, proc { self.delete })
end

def delete
puts 'deleting object'
@@no_foo # => 1
@@no_foo -= 1
@@no_foo # => 0
end

def self.no_foo
@@no_foo # => 0, 1
end
end

Foo.no_foo # => 0
f = Foo.new
f = nil

GC.start
Foo.no_foo # => 1

# >> creating object
# >> deleting object

最佳答案

它可以工作,但在完成时存在循环引用。您的终结器取决于应收集的对象的绑定(bind)。参见 this solution .

class Foo
@@no_foo = 0

def initialize
@@no_foo += 1
ObjectSpace.define_finalizer(self, Foo.method(:delete))
end

def self.delete id # also this argument seems to be necessary
@@no_foo -= 1
end

def self.no_foo
@@no_foo
end
end

Foo.no_foo # => 0
1000.times{Foo.new}
Foo.no_foo # => 1000

GC.start
Foo.no_foo # => 0

关于ruby - 如何计算 ruby​​ 中某个类的现有实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794896/

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