From: Masaya TARUI Date: 2010-05-31T19:16:38+09:00 Subject: [ruby-dev:41482] Re: [Feature #3328] Kernel#p outputs as default_internal encoding, and so on 樽家です。 2010年5月24日21:18 NARUSE, Yui : > 成瀬です。 > > (2010/05/21 8:10), Masaya Tarui wrote: >> Feature #2102 [ruby-dev:39343] でString#inspectについては強制的にencodingを >> 揃えるようになりましたが、SymbolやRegexpについてはそうなっておらず、 >> 同じような簡単にエラーになる状態になっています。ユーザー定義のinspectにも >> 同様です。またにinspectで文字コードの違いが区別できません。 > > Symbol と Regexp は忘れていました。 > 確かに対処が必要だと思います。 > >> そこで、Kernel#pで表示する前やArrayやHashで各inspect結果をマージする前に、 >> String#inspectと同様な処理を行うのはどうでしょうか?具体的にはinspectで >> 想定するEncodingと異なる場合に、非ASCII文字をエスケープ表示にする >> String#inspect_encodeを追加し、それをrb_inspectから呼ぶ事を提案したいと >> 思います。ASCII文字については手を加えないため、不可逆ですが実用上は問題 >> ないと思います。 ご検討をお願いします。 > > 同様な処理といいながらなぜ新しい API を追加するんですか。 > > -- > NARUSE, Yui > > > 同様な処理といいながらなぜ新しい API を追加するんですか。 Featureなので、私的に思い切ってどう処理したら理想的だろうと考えた結果です。 同様な処理=inspect_encodeですが、結局Symbol型やRegexp型に限らず 必要になりそうなので分離したいと思いました。 これを導入した場合、元のString#Inspectを String#old_Inspectとした場合、 String型aに対して、a.inspect と a.old_inspect.inspect_encode が同じになります。 なので、導入後にString#inspectを元に戻したとしてpの結果は変わりません。 ユーザー定義型の場合、inspectはしばしばユーザーが定義しますが、その時もケアして やりたかったので、こういう形の提案になりました。 その前段階でユーザー定義のinspectはほっておいて、Symbol,Regexpの後処理と、Array, Hashなど再帰的にItemのinspectを呼ぶものについて、String#inspect_encodeを被せても いいかなとも思っています。 その場合、APIとして公開する必要はありませんし、pの定義も変わりませんので、穏当ではあります。 -- 樽家昌也(Masaya TARUI) No Tool,No Life.