標準出力に一時ファイルを代入したら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でも動きました。

http://rurema.clear-code.com/1.9.3/method/IO/i/flush.html