なかだです。

At Fri, 10 Oct 2003 11:25:38 +0900,
岩崎 弘孝 wrote:
>  2.クラスCのインスタンス変数と直接関係しないリソースの開放処理であれば
>    ObjectSpace.define_finalizer で リソース開放を行うProcを定義して処理可能(らしい)。

finalizerが呼ばれる時点では対象のオブジェクトはすでに破棄されて
いるのでインスタンス変数としてはアクセスできませんが、finalizer
から参照される限りインスタンス変数だったオブジェクト自体はまだ
生きていますから、アクセス可能です。

  class C
    attr_accessor :data
    def self.save_data_proc(data, dirty, file)
      proc do
        if dirty[0]
          open(file, "w") {|f| Marshal.dump(data, f)}
        end
      end
    end
    def initialize(*data)
      @data = data
      @dirty = [false]
      fin = self.class.save_data_proc(@data, @dirty, "saved.data")
      ObjectSpace.define_finalizer(self, fin)
    end
    def dirty?
      @dirty[0]
    end
    def dirty=(d)
      @dirty[0] = d
    end
  end

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦