@edgerunner's solution almost worked. Basically, you cannot create a closure in place of the define_finalizer
call since that captures the binding of the current self
. In Ruby 1.8, it seems that you cannot use any proc
object converted (using to_proc
) from a method that is bound to self
either. To make it work, you need a proc
object that doesn't capture the object you are defining the finalizer for.
class A
FINALIZER = lambda { |object_id| p "finalizing %d" % object_id }
def initialize
ObjectSpace.define_finalizer(self, self.class.method(:finalize)) # Works in both 1.9.3 and 1.8
#ObjectSpace.define_finalizer(self, FINALIZER) # Works in both
#ObjectSpace.define_finalizer(self, method(:finalize)) # Works in 1.9.3
end
def self.finalize(object_id)
p "finalizing %d" % object_id
end
def finalize(object_id)
p "finalizing %d" % object_id
end
end
a = A.new
a = nil
GC.start
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…