From: Koji Arai Date: 2002-02-22T04:37:27+09:00 Subject: [ruby-dev:16034] Re: $stdin/out/err への代入 新井です。 In message "[ruby-dev:16033] Re: $stdin/out/errへの代入" on 22 Feb 2002 03:38:10 +0900, matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > > In message "[ruby-dev:16032] Re: $stdin/out/err への代入" > on 02/02/22, Koji Arai writes: > > |IO#redirect(io) (io.fileno を dup2 する) > |IO#redirect(path, [mode]) (path を open して、dup2 して close する) > | > |も追加しても良いですね。で、前のメールの結論を書き直しますが、 > |$stdout, $stderr, $stdin への代入は現状維持(案1:1.6のまま)し > |て obsolete と明言、代わりに redirect メソッドを使ってくださ > |いとアナウンス > | > |というのが現実的な解のように思えて来ました。 > > IO#redirectは興味深いですね。pathを指定するのはFile#redirect > ではないかという気もしますが。 File のメソッドってことはないと思います。path を渡すインタ フェースはそれがあった方が便利だろうってだけですから。違和感 あるならなくしても構いませんが STDOUT.redirect(File.open("/tmp/hoge", "w")) だと、close が GC 任せになりますからやっぱあった方が便利。 > あと、気になるのはreopenとの関係はどうなるんでしょう? 結局 > 同じ(いや、reopenは中ではかなりスゴいことをしてるんですが)よ > うな気がするんです。 redirect はクラスを変えない。reopen は変えることがあるという のが違いだと思います。思考錯誤の中で reopen と同じインタフェー スを持たせればdup2 というメソッド名にする必要ないなあという のが最初の意図だったですが、これはどうでもいい話です(^^。 reopen は恐いというのがマニュアルからしみついた印象ですが、 そこまでする理由が実はよくわからなかったりします。 ん?もしかして、クラス変えないと f = File.open("/tmp/foo", "w") f.reopen(STDOUT) p f.path が、どうなるのってことからかなあ? じゃあ、redirect はどうするかっていうと、うーん (1) File#redirect は undef する(元もと STDOUT 等のための メソッドなので、IO のメソッドだけにする) (2) File#redirect は リダイレクト先の情報(pathなど)を 可能な限り取得する (3) File#redirect すると File が保持する情報はすべてクリア しちゃう。 (4) STDIO < IO というクラスを作って redirect はこのメソッドにする stdout、stdin、stderr はこのクラスのインスタンスにする うーん (1) かなあ。 > さらに、いっそ1.7(1.8)では$stdinなどなどをread onlyにするの > はどうだろうか、と思ってしまいました。互換性なさすぎるかなあ。 まあ、互換性は維持しましょうということで、上記が現実解だと思っ てます。 -- 新井康司 (Koji Arai)