前田です。

At Thu, 16 Oct 2003 23:07:12 +0900,
堀川 久 <vzw00011 / nifty.ne.jp> wrote:
> 次のスクリプトは画面にfooと表示されます。
> 
>   require "cgi"
>   cgi = CGI.new
>   print cgi.header() 
>   $stdout.print "foo\n"
> 
> 一方、次のスクリプトは画面に何も表示されません。
> 
>   require "cgi"
>   cgi = CGI.new
>   print cgi.header() 
>   STDOUT.print "foo\n"
> 
> $stdoutとSTDOUTは、実用上は同じかと思っていたのですが、内部では違うの
> でしょうか。

まず、STDOUTは標準出力を表すIOオブジェクトです。
一方、$stdoutはスクリプトのデフォルトの出力先で、そのデフォルト値
はSTDOUTになっています。
ですから、$stdoutを書き換えなければ「実用上は同じ」ですね。
$stdoutはIOであることは要求されないので、mod_rubyでは(スクリプト
が呼び出されるたびに)$stdoutをApache::Reuqestオブジェクトにするよ
うにしています。

STDOUTの方は定数なので、一般的には「標準出力を表すIOオブジェクト」
という意味を変えるべきではないと思います。
問題はmod_rubyという特殊なケースでどうするべきかですが、$stdoutと
STDOUTが分かれているのは、まさにmod_rubyのようなケースを想定して
そうなっているような気がするので、現状でいいんじゃないかなあ…。
実際問題としては、もともとのSTDOUTにアクセスできてもforkする時く
らいしか意味はないかもしれませんが。
あと、STDOUTを書き換えるのは簡単ではあるのですが、いったんSTDOUT
を削除してからもう一度定義することになるので、何となく抵抗があります。

というわけで、もう少し他の方の意見もお聞きしたいところです。

-- 
前田 修吾