青山です。 Mon, Apr 19, 1999 at 01:58:22PM +0900 において toyofuku / juice.or.jp さん曰く: > 普通の処理系の実装で上の例では最適化しない限り B は GC > できないだろうと考えて「B も参照している」と書いたのですが あの例の場合、GC されないのは単に B = [] による束縛があるからです。 式 if (i*i >= 0); A; else B; end では参照が発生しない事はもちろん、B の参照しているオブジェクトを GC されないようにする効力も無いと思われま す。(以下の例では remove_const を使用する為に Test クラスを使用してい ますが、トップレベルでも同じ事のはずです) $ ruby -e ' class Test A = []; B = [] def Test.e(i); if (i*i >= 0); A; else B; end; end remove_const(:B) # 本当は remove_const するまでもなく、B = [] 自体が不要 p e(1) end ' [] という事で、この式は B を本当にまったく参照しないので(B が未定義という エラーも発生しない)、この式があっても B(によって参照されていた [])は GC されると思います。 ちょうど [ruby-talk:00284] で、まつもとさんが書かれています。 > The object no > longer referred from anywhere, is automatically recycled. この場合の referred とは、束縛等の事ではなく、評価の事であり(ですよね?)、 上の例でいうと、remove_const 後の B(によって参照されていた [])は "The object no longer referred from anywhere" な状態になるので、GC の 対象になると思います。 -- 青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>