logo       

[ruby-list:42116] Re: puts,printの出力をファイルにも出力するには: msg#00147

lang.ruby.japanese

Subject: [ruby-list:42116] Re: puts,printの出力をファイルにも出力するには

永井@知能.九工大です.

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>
Google Custom Search

News | FAQ | advertise