青山です。

Tue, Apr 20, 1999 at 01:42:03AM +0900 において
Shin-ichiro Hara さん曰く:

> |> |  def Test.e(i); if (i*i >= 0); A; else /abc/; end; end
> |> 
> |> だった場合,正規表現オブジェクトはGCされないんですよね.
> |
> |え、そうなんですか。もともと正規表現オブジェクトが生成されないから、
> |GC されないというような落ちではないですよね。他にも例外(?)のような場合っ
> |てあるのでしょうか。
> 
> いや、これは単に i*i >= 0 が false になるようなクラス
> はいくらでも作れるから、ということですよね。

え、いえ、false になったとしても、先の B の場合であれば B が未定義とい
うエラーになり、この式自体はオブジェクトを GC の対象外にする効力は無い
はずなんです。

(/abc/ の場合であれば、false になって /abc/ が評価された段階で正規表現
オブジェクトが生成されるのが本来だと思われますが、これが速度アップの為
に、構文解析の段階で生成されているのだと思われます。)

そして、それに対する回答がすでにまつもとさんからありましたが、リテラル
に対応するオブジェクトは構文木が参照しているので GC の対象にならないと
いうのが現在の Ruby の実装のようです。


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