当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby ObjectSpace.define_finalizer用法及代码示例


本文简要介绍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-lang.org大神的英文原创作品 ObjectSpace.define_finalizer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。