標準出力に一時ファイルを代入したらpとputsで挙動が異なる
前のエントリーを書いている時の恐怖体験。
IO#reopenを使わず、$stdoutに代入したら変な挙動に。
require 'tempfile' t = Tempfile.open("") $stdout = File.open(t, "w") p "Whoops!" $stdout = STDOUT p File.read(t) #=> "\"Whoops!\"\n"
pでは出力されたのが、
require 'tempfile' t = Tempfile.open("") $stdout = File.open(t, "w") puts "Whoops!" $stdout = STDOUT p File.read(t) #=> ""
putsだと出ない。
9/2追記:しのぎ方を発見。
require 'tempfile' t = Tempfile.open("") $stdout = File.open(t, "w") puts "Whoops!" $stdout.flush # 対応策 $stdout = STDOUT p File.read(t) #=> "Whoops!\n"
IO#flushで内部バッファをフラッシュすれば、putsでも動きました。