From: Hideto ISHIBASHI Date: 2000-07-15T18:39:21+09:00 Subject: [ruby-dev:10330] Re: [REQ] print a warning message for overriding Object#__id__ 石橋"rubyholic"秀仁です。 まつもとさんリプライありがとうございます。 From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-dev:10327] Re: [REQ] print a warning message for overriding Object#__id__ > |* Object#id, __id__ の再定義に警告してほしい > |__id__ を再定義するのは、やばいですよね。 > > そうですね。考えてみましょう。 よろしくお願いします :-) さらに思い出しました。__send__ や _id2ref なども、 その警告の対象として適当だと思います。 ところで、デフォルトの Object#id/__id__ の定義は、 : VALUE : rb_obj_id(obj) : VALUE obj; : { : if (rb_special_const_p(obj)) { : return INT2NUM((long)obj); : } : return (long)obj|FIXNUM_FLAG; : } となっていますが、この Object#id の仕様は、 言語仕様に限りなく近いものなのでしょうか? そうでしたら、リファレンスなどに明記されるとありがたいです。 この定義により、Ruby スクリプトのバグの可能性があるからです。 ruby コマンドの実行中に、同じ ID のオブジェクトが、 複数回、生成される可能性があります。GC の影響ですね。 WeakRef は finalizer でこの現象に対処しています。 しかし、この処理をうっかり忘れたスクリプトでは、 オブジェクトがすりかわって質の悪いバグになりそうです。 > |ObjectSpace.call_finalizer というメソッド名は、 > |ちょっと分かりにくかったです。ふつう "call..." というと、 > |「その場で call する」ような印象がありますので。 > |かといって、なかなかいい名称は思い浮かびません・・・ > |すみません。 > > ですよねえ。ま、 require 'final' していただければ、それを直 > 接見ることはないと思います。ほんとはこれを組込みにするべきで > したね。 なるほど。たしかに Ruby 本でも require 'final' ですしね。 あまり一般ユーザには関係ないわけですね。 しかし、いちおう名前を考えました。イマイチですが (^^; finalizer_called_for(object) assign_finalizer(object) to_be_finalized(object) -- Hideto "rubyholic" ISHIBASHI http://www.rr.iij4u.or.jp/~hideto-i/ blade clone: http://www.rr.iij4u.or.jp/~hideto-i/rb/yaiba/index.html