原です。 > 豊福@パパイヤです。 > > 原さん > > TheArray = [] > > class YaArray > > def push(x); TheArray.push x; end > > def e(i); TheArray[i]; end > > end > > foo = YaArray.new > > foo.push("obj1") > > foo.push("obj2") > > p foo.e(0) #=> "obj1" > > p foo.e(1) #=> "obj2" > > > > このときオブジェクト foo は "obj1", "obj2" を参照していると > > 言っていいのでしょうか?参照している様にも見えるけど、単に参 > > 照関係を横から見ているだけの様にも思えるし。 > > 参照とは何かに答えられないですが、現実の GC の実装の > 感覚に合う「何か」は私もあると思います。 > それに合うように上の例を解釈すると、 > def e(i); x = TheArray; return x.[](i); end > と読み直して「e() のコードの中に TheArray を参照する値が > 入っている。TheArray[0] は return をつたって通り抜けて > しまうから "obj1" そのものは参照していない」と見ています。 何となく分かったような気もします。 しかしですね。これを「参照していない」と言うなら、Array の インスタンスも何も参照しないという結論もある得るかと思うの です。というのは、Array と同等でインスタンス変数を持たない クラスをユーザーが作れるかという話を以前したんですけど、 原理的には TheArray というただ一つの Array オブジェクトが あれば作れます。つまりこれをリニアなメモリだと考えることで、 直列に並べれば複数の配列を格納できるからです。GC だってユー ザーがコントロールできるかもしれません。ということは、TheArray を使って Array と同じ機能を持つクラスでありながら、Array は 要素を参照してこっちはしていないとは言えないのではないか。も しかすると隠れオブジェクトとして実際の Array の実装に TheArray みたいなのが使われている可能性だって無いわけではない。 って屁理屈でしょうか? > > の名前になっているとは初耳です。ここでの意味は、オブジェ > > クトに対する全てのメッセージ(とパラメータ)に対する副作用 > > と返り値の「表全体」をもってオブジェクトの状態と定義する、 > > という感じでしょうか。 > > 詳しい意味はわからないのですが、もしあらゆる実際の返り値 > だけから参照を考えるという意味なら次の例が私の感覚に合い > ません。 > > A = []; B = []; > ... > def e(i); if (i*i >= 0) A; else B ; end > > e(i) は A しか実際には返しませんが B も参照していると思い > ます。 ふーむ、なるほど。Java だったら「最適化」しちゃうかも。:-)