読者です 読者をやめる 読者になる 読者になる

RubyCGIの警告

Ruby

今更な話なのだが、Ruby 1.8のCGIクラスの警告の話。

ruby には String#[]というメソッドがあって

hoge = "HOGE"
puts hoge[0]   # => "72" 

みたいに指定インデックスの文字のコードを取得出来る。でもCGIでパラメータから取得した文字列の場合

hoge = cgi["hoge"]
puts hoge[0]  # => HOGE

文字コードの数字を取得出来ず、さらにSTDERRに警告が出る

CAUTION! cgi['key'] == cgi.params['key'][0]; if want Array, use cgi.params['key']

たしかにRubyリファレンスマニュアルには「警告が出ます」と書かれているのだが、どうやらその警告はString#[]メソッドが出してるようで、Ruby 1.6のCGIと同じ動きをするように[]メソッドが特異メソッドとして再定義されているようだ。んー、こりゃ不便

require "cgi"
cgi = CGI.new
hoge = cgi["hoge"]

cgi.out("status" => "OK", "type" => "text/plain", "charset" => "utf-8") {
  hoge.class.to_s + "\n" +hoge.singleton_methods.join("\n")
}

こんな結果が返ってくる。

String
[]
set_params
last
to_a
to_ary
first

特異メソッドの無い普通のStringインスタンスを取得したい場合は、Ruby 1.6のやり方で

hoge = cgi.params["hoge"][0]
puts hoge[0]  # => 72

とすればいいようだ。とても気持ちが悪い