From: Yukihiro Matsumoto Date: 2007-11-26T08:47:34+09:00 Subject: [ruby-list:44277] Re: [Q] cgi.rbについての質問 まつもと ゆきひろです In message "Re: [ruby-list:44276] [Q] cgi.rbについての質問" on Mon, 26 Nov 2007 00:09:10 +0900, "Makoto Kuwata" writes: |(1) cgi.rb のテストスクリプトはありますか。 | 1.8.6のソースには見当たりませんでした。 cgi.rbは現在作者が到達可能ではないので私が「消極的メンテナ」 を担当しています。ので、作者がテストスクリプトを書いていない ので、存在しないと思います。 この後の(2)〜(3)の質問に関しても「なぜか」の部分は答えられま せん。cgi.rbはPerlのcgi-libの影響を受けていますから、その辺 の理由もあるでしょうし、作者の気まぐれもあるでしょう。 |(4) CGI::parse() は以下のように定義されてますが(895行目)、 | | def CGI::parse(query) | params = Hash.new([].freeze) | query.split(/[&;]/n).each do |pairs| | key, value = pairs.split('=',2).collect{|v| CGI::unescape(v) } | if params.has_key?(key) | params[key].push(value) | else | params[key] = [value] | end | end | params | end | | これを次のように書き換えたとしても大丈夫でしょうか。 | 問題は、freezeした配列を使い回していいのかという点です。 | | FROZEN_ARRAY = [].freeze | def CGI::parse(query) | params = {} | query.split(/[&;]/n).each do |pairs| | key, value = pairs.split('=',2) | (params[CGI::unescape(key)] ||= []) << CGI::unescape(value) | end | params.default = FROZEN_ARRAY | params | end いいんじゃないでしょうか。Frozenなんだし。 まつもと ゆきひろ /:|)