From: Masatoshi SEKI Date: 2010-05-16T23:06:00+09:00 Subject: [ruby-dev:41329] NoMethodErrorなどのmessage 咳といいます。 助けて下さい。 ちょっと前からRWikiというWiki風のアプリケーションを 書いています。 たくさんのオブジェクトを参照しているRWikiのオブジェクトに、 irbで対話的にメッセージを送ることがよくあるのですが、 その際にメソッド名を間違えるととても長い時間待たされて 困っています。 1.8系のerror.cを見るとname_err_mesg_to_str()で d = rb_protect(rb_inspect, obj, 0); if (NIL_P(d) || RSTRING(d)->len > 65) { d = rb_any_to_s(obj); } desc = RSTRING(d)->ptr; のように、一度inspectした結果が長いときに、to_sの結果を メッセージとするようです。 件のように大きな(?)オブジェクトの場合には、長い時間を かけてinspectして、それを捨ててto_sすることになります。 この関数はMarshalの際にも呼ばれるようで、dRubyで例外が あがる際にもエラーを印字しない場合にも長い時間がかかります。 それで提案です。 inspectは呼ばずに、いつもrb_any_to_s()、あるいは #<クラス名:オブジェクトid> の形式(なんていうの?)をメッセージに入れるのはどうで しょうか? 現状のようにinspectの長さに応じて表記が変わるのであれば、 エラーメッセージから機械的に元のオブジェクトを 求めるのは難しそうですから、メッセージを処理してる ひとも少ないと想像してます。