1

我正在学习 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

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

我找不到删除对象的方法。

4

2 回答 2

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
于 2013-05-31T09:16:52.837 回答
1

尽管 ruby​​ 没有显式的析构函数,但它支持终结器。终结器是在您的对象被垃圾回收时调用的一段代码。

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

于 2013-05-28T14:12:30.060 回答