この質問からのアイデアは次のとおりです。オブジェクトの作成時に、クラス変数をインクリメントします。オブジェクトが収集されたら、デクリメントします。ご覧のとおり、ファイナライザーが呼び出され、@@no_foo
デクリメントされます。しかし、しばらくしてクエリを実行すると、デクリメントはなくなりました。値が上がるだけで、下がることはないようです (2 つのオブジェクトを作成すると、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