From: "NARUSE, Yui" Date: 2008-08-30T17:20:52+09:00 Subject: [ruby-dev:36056] Re: TypeError from Encoding.compatible? (r18920) 成瀬です。 Yukihiro Matsumoto wrote: > |このような誤解を招く動作をするよりは、 > |潔く例外を出してくれた方がいいと考えました。 > |# Encoding.compatible? が encoding を取れるようにするべき、 > |# という案については現在思案中 > > っていうか、その「思案」が終わってから変更してもよかったんじゃ > ないんですかね。 1.9.1 仕様の fix が迫ってきたので、とりあえず今のままじゃまずいだろうと。 あと、encoding の場合はその encoding が何を意図しているのか難しいので。 > |まつもとさんの仰る仕様ならば一貫性があるのでよいと思うのですが、 > |現行の仕様では compatible な時に enc を返す以上、 > |false と nil で区別という方法が使いづらいのがネックでしょうか。 > |enc / false / nil でもいいのかなぁ・・・。 > > やっぱり enc / false / nil はおかしい気がしますね。うーん。 > true / false / nil にして、最少公倍数なエンコーディングを求 > めるメソッドは別に持つとか...。 Encoding.compatible? は enc / nil にして、 C レベルで言う enc_capable 的なものを用意するのもありかも、とかは。 この場合 obj#encoding の有無で判断とかになるんでしょうが、 一方で IO#encoding はなかったりするわけです。 > |r18920 の意図は Encoding.compatible? が対応しているオブジェクトと、 > |対応していないオブジェクトをはっきりわけることだったので、 > |例外を出すことにこだわりはないのですが・・・。 > > Encoding.compatible?がなにをとるかを明確にする必要があると思 > います。 > > たとえば将来IOとかStringIOとか「文字列のように振る舞うなにか」 > を引数にとるような可能性を考えると、今のようなチェック(文字列 > か正規表現のみ)はあまり良くないような気がします。 IO 系のことは考えたんですが、今の Encoding.compatible? とは そぐわないように感じました。 そもそも、IO は入力と出力で話が違うわけで、 たとえば、「US-ASCII の IO 出力」と「UTF-8 の文字列」は×です。 しかし、「US-ASCII の IO 入力」と「UTF-8 の文字列」は○で、 encoding を返すならば UTF-8 でしょう。 また、Encoding.compatible? は中身の ASCII ONLY まで見るわけですが、 これを IO に適用することは困難です。 つまり、IO を仮に引数とする場合、 その encoding を持ち CODERANGE_VALID な string とみなす、 ということになるかと思うのですが、果たしてこれが、 Encoding.compatible?(io, str) と書いた場合の期待通りかというと、 なかなかあやしい所なんじゃないかなぁと。 encoding の場合も同様で、その encoding がどこの encoding かによって、 "compatible" の意味が変わってきます。 一方で、regexp に関しては文字列と絡む部分がマッチのみなので、 もう一方のなにかの encoding を文字列の encoding とみなし、 当該 regexp のマッチ可能かで判断するということで決められました。 という具合に話はなかなか難しいわけです。 -- NARUSE, Yui