本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。