这是来自 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/