原です。
In message "[ruby-list:13962] Re: What is Object in Ruby? (Re: Ruby and LISP)"
on 99/04/21, Wakou Aoyama <wakou / fsinet.or.jp> writes:
|
|青山です。
|微妙になにかがずれているような感じはするものの、ちょっとまだつかめてい
|ません。すみません。
いえいえ。この件に関して青山さんが良く理解していることも、ちょっと私
が誤解していたことも理解しています。(~~;
私がむずむずしてたのはこういう事です。まず、突っ込みを入れると、
: def e(i); if (i*i >= 0); [1,2,3]; else [4,5,6]; end; end
|この場合 GC の対象以前に [4,5,6] というオブジェクトが生成されません。
必ずしもそうではないです。さらに
|false になった場合も [4,5,6] は生成されるものの、すぐにどこからも長く
|参照されない状態になるのでやはり GC の対象になると思われます。
これも場合によっては違います。例えば
def e(i); if (i*i >= 0); [1,2,3]; else [4,5,6]; end; end
class Foo; def *(x); -1; end; end
$var = e(Foo.new)
とすると、[4,5,6] というオブジェクトは生成され、しかも GC の
対象にならないですね。もちろんこれは特に後半は、青山さんの文
脈を無視したあげ足とりに近いですが。
で、今回の件(/abc/ と "abc" では生成されるタイミングが違うこと)
を説明するためには、そんな誤解を招きやすいコードではなくストレ
ートに、例えば
def f; /abc/; end
def g; "abc"; end
p f.equal? f #=> true
p g.equal? g #=> false
で十分では?と言いたかったんです。(この現象がメソッド定義部に
固有なものだと誤解されない様に [ruby-list:13922] ではトップ
レベルでのループを書いたんです。)まず GC をからめない説明。
そもそもなんで e(i) の様なものが出てきたかというと、豊福さんが
[ruby-list:13822] で gotoken さんの「オブジェクトの状態とは、メ
ッセージに対する応答性のみで決まる」という説の反論として出てき
たので、(最初は)直接 GC と関連づけられていたのではないですね。
(豊福さんは一貫して GC を元に参照を考えているわけではあるのだ
けど。)ああ、ややこしい。(^^;