青山です。

なかなか微妙な話が多数でていますね。「破壊的」の方はまつもとさんの「よ
り破壊的」という見事な逃げ道に納得。

Thu, Apr 22, 1999 at 02:07:59AM +0900 において
Shin-ichiro Hara さん曰く:
> |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 の
> 対象にならないですね。もちろんこれは特に後半は、青山さんの文
> 脈を無視したあげ足とりに近いですが。

ああ、これはちょっと言葉が少なかったような気はしていました。

[ruby-list:13957]
> ああ、評価中でなく、変数に参照されていないオブジェクトは GC の対象にな
> ると言えるのかも。

ここがその状況を想定した部分なのですが、短すぎましたね。

上の例の場合でも、$var による参照がなければ e(Foo.new) の評価が終った
段階で 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 をからめない説明。

こちらの件についてはあのように私も書いた時点では知らなかった事で、その
まま、まつもとさんへの質問になっていました。確かに GC の話を含めたまま
ではややこしかったかもしれないですね。

(GC をからめないという事ですから、上記の「生成されるタイミングが違う」
というのは、そのように見えるという話ですよね? 実際にはどちらも構文解
析時に生成されますけれど。また、どちらも構文木が参照するが、メソッド g
が返すオブジェクトはコピーなので GC の対象になるというような事なんかも
ありますが。)

> そもそもなんで e(i) の様なものが出てきたかというと、豊福さんが
> [ruby-list:13822] で gotoken さんの「オブジェクトの状態とは、メ
> ッセージに対する応答性のみで決まる」という説の反論として出てき
> たので、(最初は)直接 GC と関連づけられていたのではないですね。
> (豊福さんは一貫して GC を元に参照を考えているわけではあるのだ
> けど。)ああ、ややこしい。(^^;

そうそう。私も「一人だけ別な方向へ展開してしまった」とか書いていますが、
上記のように、最初に書いた時点ではこのような例外があるとは知りませんで
した。

リテラルや正規表現(//)は例外として対象外にすれば、すなわち、リテラルや
正規表現(//)を用いないサンプルで GC を元にして参照を考えるのはなかなか
いい手だとは思います。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>