當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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