本文简要介绍ruby语言中 ObjectSpace.define_finalizer
的用法。
用法
define_finalizer(obj, aProc=proc())
添加 aProc
作为终结器,在 obj
被销毁后调用。 obj
的对象 ID 将作为参数传递给 aProc
。如果 aProc
是 lambda 或方法,请确保可以使用单个参数调用它。
返回值是一个数组 [0, aProc]
。
推荐的两种模式是在非实例方法中创建终结器过程,它可以安全地捕获所需状态,或者使用自定义可调用对象,将所需状态显式存储为实例变量。
class Foo
def initialize(data_needed_for_finalization)
ObjectSpace.define_finalizer(self, self.class.create_finalizer(data_needed_for_finalization))
end
def self.create_finalizer(data_needed_for_finalization)
proc {
puts "finalizing #{data_needed_for_finalization}"
}
end
end
class Bar
class Remover
def initialize(data_needed_for_finalization)
@data_needed_for_finalization = data_needed_for_finalization
end
def call(id)
puts "finalizing #{@data_needed_for_finalization}"
end
end
def initialize(data_needed_for_finalization)
ObjectSpace.define_finalizer(self, Remover.new(data_needed_for_finalization))
end
end
请注意,如果您的终结器引用要终结的对象,它将永远不会在 GC
上运行,尽管它仍将在退出时运行。如果您将要完成的对象捕获为终结器的接收者,您将收到警告。
class CapturesSelf
def initialize(name)
ObjectSpace.define_finalizer(self, proc {
# this finalizer will only be run on exit
puts "finalizing #{name}"
})
end
end
另请注意,终结可能是不可预测的,并且永远不能保证在退出时运行。
相关用法
- Ruby ObjectSpace.memsize_of_all用法及代码示例
- Ruby ObjectSpace.count_symbols用法及代码示例
- Ruby ObjectSpace.count_imemo_objects用法及代码示例
- Ruby ObjectSpace.allocation_generation用法及代码示例
- Ruby ObjectSpace.each_object用法及代码示例
- Ruby ObjectSpace.reachable_objects_from用法及代码示例
- Ruby ObjectSpace.allocation_class_path用法及代码示例
- Ruby ObjectSpace.count_objects_size用法及代码示例
- Ruby ObjectSpace.count_nodes用法及代码示例
- Ruby ObjectSpace.trace_object_allocations用法及代码示例
- Ruby ObjectSpace.count_objects用法及代码示例
- Ruby ObjectSpace.count_tdata_objects用法及代码示例
- Ruby ObjectSpace.allocation_method_id用法及代码示例
- Ruby ObjectSpace模块用法及代码示例
- Ruby Object.instance_variable_get用法及代码示例
- Ruby Object.display用法及代码示例
- Ruby Object.remove_instance_variable用法及代码示例
- Ruby Object.define_singleton_method用法及代码示例
- Ruby Object.methods用法及代码示例
- Ruby Object.public_send用法及代码示例
- Ruby Object.xmp用法及代码示例
- Ruby Object.singleton_methods用法及代码示例
- Ruby Object.enum_for用法及代码示例
- Ruby Object.freeze用法及代码示例
- Ruby Object.inspect用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 ObjectSpace.define_finalizer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。