From: matz@... (Yukihiro Matsumoto) Date: 1998-03-13T15:12:02+09:00 Subject: [ruby-dev:1760] Re: WeakRef まつもと ゆきひろです In message "[ruby-dev:1759] Re: WeakRef" on 98/03/13, 石塚圭樹 writes: |ですよね. もうちょっと(Cの中に)隠蔽したほうが良くありません? |WeakRef::__getobjCで書くってことですが... | |rubyでクラスを書いて一部のメソッドだけCにするとかできないんでしたっけ? できないことはないんですけど,当然クラスの方が先に定義される 必要があります.weakref.rbがロードされるまでWeakRefってクラ スは存在しませんから, * WeakRef::__getobjCを定義するダイナミックライブラリを weakref.rbからロードする(静的リンクしかできないアーキテ クチャでは使えない) * WeakRefという名前のクラスに__getobjCというメソッドを追加 するメソッド(ややこしい^^;;;)を定義してweakref.rbから呼 び出す. のいずれかが必要になりますね.どっちも面倒なわりにそれほど効 果が無いので,un-documented メソッドとしてのid2refを許した方 がましだと思います. | def initialize(orig) | super | @id = orig.id | ObjectSpace.call_finalizer orig |-> ObjectSpace.call_finalizer id | ID_MAP[@id] = self.id | ID_REV_MAP[self.id] = @id | end |end | |の``->''部分がが必要なのでは? ObjectSpace.call_finalizer self ですね.確かにそうです.追加します. |finalizerでWeakRefをコールバックする方法です. | |これだと, 全体的に簡単になり記述も直接的でわかりやすいと思いますが, |ID_MAPがWeakRefを直接参照しているためにGCの対象にならないところがまず |い? その通りです.WeakRefが一生GCの対象にならないのはまずいでしょ う,多分. まつもと ゆきひろ /:|)