原です。

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 を元に参照を考えているわけではあるのだ
けど。)ああ、ややこしい。(^^;