From: Shugo Maeda Date: 2003-10-17T13:47:48+09:00 Subject: [ruby-list:38602] Re: mod_rubyでのSTDOUTについて 前田です。 At Thu, 16 Oct 2003 23:07:12 +0900, 堀川 久 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 を削除してからもう一度定義することになるので、何となく抵抗があります。 というわけで、もう少し他の方の意見もお聞きしたいところです。 -- 前田 修吾