删除对象时运行方法

我正在学习ruby并且没有找到覆盖等效object.delete函数的方法:

这就是我这样做的方式:

  class Foo @@no_foo=0 def initialize @@no_foo+=1 end def delete #class specific cleanup... @@no_foo-=1 end def Foo.no_foo return "#@@no_foo" end end def delete(obj) #object independent cleanup... obj.delete return nil end foo1 = Foo.new foo2 = Foo.new puts Foo.no_foo puts foo2 foo2 = delete(foo2) puts foo2 puts Foo.no_foo 

正如你所看到的,这是处理事情的一种hacky方式……有没有更简单的方法来解决这个问题?
基本上我想在减少该类的总计数器的同一调用中使我的对象无法访问。 在将变量(指向对象的指针)设置为nil时,我找不到一个被调用的方法。

我发现无法删除对象。

虽然ruby没有明确的析构函数,但它支持终结器。 Finalizer是一段代码,当您的对象被垃圾收集时会被调用。

 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 

似乎您将无法在终结器中执行特定于实例的清理。 它必须与实例完全分离才能正常工作。 以下是可能对您有帮助的答案 : 回答 , 回答 。

根据@RubyLovely提供的链接: WeakRef 。
我把以下示例类放在一起:

 require 'weakref' class Foo #block to excecute on GC.start... FINALIZER = lambda { |object_id| p "finalizing %d" % object_id; @@no_foo -=1 } @@no_foo=0 def initialize @@no_foo+=1 #Initialising the finalizer... ObjectSpace.define_finalizer(self, FINALIZER) end def Foo.no_foo @@no_foo end end foo = Foo.new foo = WeakRef.new(foo) puts Foo.no_foo GC.start puts Foo.no_foo