[ruby-list:39026] Re: CGI#[] on Ruby

From: 堀川 久 <VZW00011@...>
Date: 2004-01-07 00:18:25 UTC
List: ruby-list #39026
おはようございます。

> 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はシンプルにしてはどうでし
ょうか。

よろしくお願いします。

In This Thread

Prev Next