From: Yukihiro Matsumoto Date: 2010-05-30T15:19:10+09:00 Subject: [ruby-dev:41470] Re: NoMethodErrorなどのmessage まつもと ゆきひろです In message "Re: [ruby-dev:41329] NoMethodErrorなどのmessage" on Sun, 16 May 2010 23:06:00 +0900, Masatoshi SEKI writes: |ちょっと前からRWikiというWiki風のアプリケーションを |書いています。 |たくさんのオブジェクトを参照しているRWikiのオブジェクトに、 |irbで対話的にメッセージを送ることがよくあるのですが、 |その際にメソッド名を間違えるととても長い時間待たされて |困っています。 もうちょっと状況を説明してください。 まず、inspectを避けるかどうかを考える前に、NameError系はまさ にこのような「とても長い」処理を避けるために、to_strを遅延し ています。例外を印字しようとするなど明示的に要求しない限り、 to_strを呼ばないはずです。ということは、本来 |この関数はMarshalの際にも呼ばれるようで、dRubyで例外が |あがる際にもエラーを印字しない場合にも長い時間がかかります。 のように「印字しない場合にも呼ばれる」ということは起きないは ずです。にもかかわらず、長い時間がかかると言うのは、dRubyが無 駄にmessageを取り出しているのではないでしょうか。でなければ、 バグです。まずはここから考えたいです。 あと、「とても長い」も興味深い点です。これは1回1回の時間はさ ほどでもないが、繰り返すので蓄積されて結果的に「とても長い」 のでしょうか、それともdRubyの性質上、inspectが内部で呼び出す to_sなどがネットワークを越えるので、「とても長い」のでしょう か。もし、後者であれば、dRuby側でプロクシーに仕掛けをして dRubyオブジェクトのinspectはネットワークを越えないようにする 手もありますよね。 |それで提案です。 | |inspectは呼ばずに、いつもrb_any_to_s()、あるいは | |#<クラス名:オブジェクトid> | |の形式(なんていうの?)をメッセージに入れるのはどうで |しょうか? それだとnilやfalse、Fixnumのようなものまで #<クラス名:オブジェクトid> になっちゃいますからねえ。 まつもと ゆきひろ /:|)