まつもと ゆきひろです

In message "[ruby-list:39021] CGI#[] on Ruby 1.8.1"
    on 04/01/05, 堀川 久 <vzw00011 / nifty.ne.jp> writes:

|Ruby 1.8.1で、CGI#[]の戻り値のクラスであるCGI::QueryExtension::Valueが
|Stringの派生クラスではなくなりましたが、副作用が出ています。
|
|文字列(Stringインスタンス)が期待されているところでは、is_a?(String)
|として値(のクラス)が正しいか検査することがあります。あるいはクラスに
|よって挙動を変えることもあります。
|
|このため、文字列と思ってCGI#[]の戻り値を使っていると、いろいろな場所で
|エラーになったり、予期しない挙動になったりしています。例えばRuby/DBIな
|どでもエラーが頻出します。
|
|これを避けるためには、次のように書かなければならず、悲しくなります。

しかし、長年is_a?で検査するのは悪いスタイルだと口を酸っぱく
して言ってるわけですから、これをどこまでサポートするべきなの
かは疑問です。

|潔く、次のようにしませんか。
|
|    def [](key)
|      params = @params[key]
|      value = params[0]
|      if @multipart
|        if value
|          return value
|        elsif defined? StringIO
|          StringIO.new("")
|        else
|          Tempfile.new("CGI")
|        end
|      else
|        value || ""              # 文字列を返す。
|      end
|    end

これはこれで動かないプログラムが出るような気がするんですが、
それは構わないんですか?

                                まつもと ゆきひろ /:|)