puts等の出力メソッドはIO#writeを呼んでいる

eshell で標準出力に出力されるタイミングが遅い問題について - gan2 の Ruby 勉強日記

puts 以外のメソッドについてはいちいちいくつも再定義するのはめんどいなーとか思ってたんだけど

putsやprintなどの標準出力への出力メソッドはIO#writeを呼んでいる。その証拠に$stdoutの特異メソッドwriteを定義してみる。特異メソッドでsuperしたら通常のIO#write呼び出しになる。その状態で出力メソッドを呼ぶと、どれもwriteを呼び出していることがわかる。

def $stdout.write(str)
  super "WRITE:"
  super
end

$stdout.write "write\n"
$stdout << "<<\n"
print "print\n"
puts "hoge"
printf "printf: %d\n", 1
# >> WRITE:write
# >> WRITE:<<
# >> WRITE:print
# >> WRITE:hogeWRITE:
# >> WRITE:printf: 1

つまり、出力メソッドを再定義する場合はwriteを再定義してしまえばよい。