|
[ruby-list:42116] Re: puts,printの出力をファイルにも出力するには: msg#00147lang.ruby.japanese
永井@知能.九工大です. From: 岩崎 弘孝 <IH000667-Hi7X7xagcuRnb2RyOFEZTHf5DAMn2ifp@xxxxxxxxxxxxxxxx> Subject: [ruby-list:42110] Re: puts,printの出力をファイルにも出力するには Date: Tue, 25 Apr 2006 12:11:26 +0900 Message-ID: <53D741AC18A5514EBA71321DAF45B4CC03132CD5-M95vvacGCLA7qSuPpBJtbTaRSJeNtKV5eBImoM+uyKU@xxxxxxxxxxxxxxxx> > 質問が間違っている上にまとはずれでした。 > $stdout.putsががなぜだめなのかということを聞くべきでした。 > > で、privateメソッドなので当たり前ということだと思います。 > 回避策は以下のようなもので良いのでしょうか? > あるいは、もっと素直な方法があるのでしょうか? 現実逃避 (^_^; で二通り考えてみました. 深くは考えてないんで,もっとスマートな書き方がありそうな気はします. ----< sample 1 >-------------------------------------------------------- class AbstractTee def self.new(*args) unless self::STDIO raise RuntimeError, "cannt create instance (abstract class?)" end super(self::STDIO, *args) end def initialize(stdio, io) @stdio = stdio @tee = true @io = io end def tee @tee end def tee=(mode) if mode && @io.closed? raise IOError, "cannt enable closed tee" end @tee = mode end def method_missing(name, *args) @stdio.__send__(name, *args) @io.__send__(name, *args) if @tee end def write(*args) @stdio.write(*args) @io.write(*args) if @tee end def tee_close @tee = false @io.close end def tee_closed? @io.closed? end def close tee_close unless tee_closed? @stdio.close end def closed? @stdio.closed? end end class StdoutTee < AbstractTee STDIO = STDOUT end class StderrTee < AbstractTee STDIO = STDERR end $stdout = StdoutTee.new(open('/tmp/asdf', 'w')) $stderr = StderrTee.new(open('/tmp/qwer', 'w')) p [1,2,3] puts 'hogehoge' print "fugafuga\n" $stdout.puts "test 0" $stdout.print "test 0" $stdout.tee = false $stdout.puts "test 1" $stdout.print "test 1" $stdout.tee = true $stdout.puts "test 2" $stdout.print "test 2" $stderr.puts "test_err" $stderr.print "test_err" $stdout.puts "end" $stderr.puts "end" $stdout.tee_close $stderr.tee_close $stdout.puts "STDOUT is still alive" $stderr.puts "STDERR is still alive" $stdout.close $stderr.close ------------------------------------------------------------------------ ----< sample 2 >-------------------------------------------------------- class IO_Tee def initialize(base_io, *io_list) @base = base_io @tee_list = io_list.dup end def add(*io_list) @tee_list |= io_list end def del(*io_list) @tee_list -= io_list end def method_missing(name, *args) @tee_list.each{|io| io.__send__(name, *args)} @base.__send__(name, *args) end def write(*args) @tee_list.each{|io| io.write(*args)} @base.write(*args) end def close @tee_list.each{|io| io.close} @base.close end def closed? @base.closed? end end $stdout = IO_Tee.new(STDOUT) $stderr = IO_Tee.new(STDERR) f1 = open('/tmp/asdf', 'w') f2 = open('/tmp/qwer', 'w') $stdout.add(f1, f2) $stderr.add(f2) p [1,2,3] puts 'hogehoge' print "fugafuga\n" $stdout.puts "test 0" $stdout.print "test 0" $stdout.del(f1, f2) $stdout.puts "test 1" $stdout.print "test 1" $stdout.add(f1) $stdout.puts "test 2" $stdout.print "test 2" $stderr.puts "test_err" $stderr.print "test_err" $stdout.puts "end" $stderr.puts "end" $stdout.close $stderr.close ------------------------------------------------------------------------ -- 永井 秀利 (九工大 知能情報) nagai-iKxUiVHJP4pSXnIrXG/8Ww@xxxxxxxxxxxxxxxx
|
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | [ruby-list:42115] Re: [Q]式中の改行と演算子位置 Was: [Q] perl の m//g に相当する処理を ruby で行ないたい, KIMURA Koichi |
|---|---|
| Next by Date: | [ruby-list:42117] Re: puts,printの出力をファイルにも出力するには, Yukihiro Matsumoto |
| Previous by Thread: | [ruby-list:42110] Re: puts,printの出力をファイルにも出力するには, 岩崎 弘孝 |
| Next by Thread: | [ruby-list:42117] Re: puts,printの出力をファイルにも出力するには, Yukihiro Matsumoto |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |