Ruby · Avançado · Inglês · Técnico
define finalizer
ObjectSpace.define_finalizer registra um proc para ser chamado depois que o objeto é coletado pelo GC. O proc não pode referenciar o próprio objeto, ou ele nunca será liberado.
Onde usar
Aparece para liberar recursos nativos, como handles de C, quando não há close explícito. Não se sabe quando roda; no pior caso, roda só quando o programa termina.
Em código
class Recurso
def self.fin(id) = proc { puts "fim #{id}" }
def initialize(id)
ObjectSpace.define_finalizer(
self, self.class.fin(id))
end
end
Recurso.new(7) # ao sair: fim 7Exemplos
Don't reference self inside the finalizer proc.
Não referencie self dentro do proc do finalizer.
The finalizer ran when the process exited.
O finalizer rodou quando o processo terminou.
Cuidado
Não dependa de finalizers para lógica de negócio: o momento é imprevisível. Prefira ensure e blocos de recurso.
Sinônimos
finalizador