我正在学习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时,我找不到一个被调用的方法。
我发现无法删除对象。
答案 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
似乎您无法在终结器中执行特定于实例的清理。它必须与实例完全分离才能正常工作。以下答案可能对您有所帮助:answer,answer。
答案 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