青山です。 Sat, Apr 17, 1999 at 03:04:49AM +0900 において Wakou Aoyama さん曰く: > > このときオブジェクト foo は "obj1", "obj2" を参照していると > > 言っていいのでしょうか?参照している様にも見えるけど、単に参 > > 照関係を横から見ているだけの様にも思えるし。 > > この横から見ているだけのようという事に対して、手も加えられるのだから、 > やはり横から見ているのではなく、同じ立場で参照しているように思われると > いう意味での foo.e().concat() の例のつもりでした。 こちらも追加。a = []; b = a とした時、b は a を参照しているのではなく [] を参照しているように、代入やメソッド呼び出しが介入しても中継ではな く、直接アクセスと同じになります。 $ ruby -e ' class Test TheArray = [] end class YaArray def initialize; @BaArray = Test::TheArray; end def push(x); @BaArray.push x; end def e(i); @BaArray[i]; end end Proc.new { foo = YaArray.new # この段階で、Test::TheArray の参照していた [] を foo も参照。 class Test remove_const(:TheArray) end #p Test::TheArray # ==> uninitialized constant Test::TheArray (NameError) # [] を参照していた Test::TheArray が無くなっても、foo が参照してい # るので [] は GC されない。 foo.push("obj1") foo.push("obj2") p foo.e(0) #=> "obj1" p foo.e(1) #=> "obj2" }.call #p Test::TheArray # ==> uninitialized constant Test::TheArray (NameError) #p foo # ==> undefined local variable or method `foo' # [] を参照していた foo も無くなれば、おそらくは [] も GC される。 ' "obj1" "obj2" -- 青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>