删除对象时运行方法

时间:2013-05-28 14:03:37

标签: ruby object finalizer

我正在学习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时,我找不到一个被调用的方法。

我发现无法删除对象。

2 个答案:

答案 0 :(得分:1)

尽管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

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

答案 1 :(得分:1)

根据@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