青山です。

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>