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を再定義してしまえばよい。