From: "堀川 久" Date: 2004-01-07T09:18:25+09:00 Subject: [ruby-list:39026] Re: CGI#[] on Ruby おはようございます。 > Date: Mon, 5 Jan 2004 22:03:38 +0900 > From: matz@ruby-lang.org (Yukihiro Matsumoto) > Reply-To: ruby-list@ruby-lang.org > To: ruby-list@ruby-lang.org (ruby mailing list) > > |文字列(Stringインスタンス)が期待されているところでは、is_a?(String) > |として値(のクラス)が正しいか検査することがあります。あるいはクラスに > |よって挙動を変えることもあります。 > | > |このため、文字列と思ってCGI#[]の戻り値を使っていると、いろいろな場所で > |エラーになったり、予期しない挙動になったりしています。例えばRuby/DBIな > |どでもエラーが頻出します。 > | > |これを避けるためには、次のように書かなければならず、悲しくなります。 > > しかし、長年is_a?で検査するのは悪いスタイルだと口を酸っぱく > して言ってるわけですから、これをどこまでサポートするべきなの > かは疑問です。 例えば引数のクラスによって挙動を変える(私はこの手のは書きませんけど)場合など にis_a?が多用されているようです。メソッドの有無により判定するより簡単だからで しょうか。 また、引数のクラスのassertionにもよく使われると思います。これは私も多用してい ます。 悪いスタイルと言われても、現に幅広く普及しているので、できるかぎりサポートした ほうが嬉しいです。 > |潔く、次のようにしませんか。 > | > | 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 > > これはこれで動かないプログラムが出るような気がするんですが、 > それは構わないんですか? 1.6用に書かれたアプリケーションがエラーになりますが、1.8で採られた対策も完璧で はない(何しろ本物のArrayインスタンスではない)ので、アプリケーション全体にわ たるテストが欠かせません。 このような場合、私はcgi.rbをrequireした後にCGI#[]を1.6互換と置き換える小さなコ ードを書いています。 この方法で1.6用のスクリプトを安全に動かせるので、1.8はシンプルにしてはどうでし ょうか。 よろしくお願いします。