Ruby でオレオレ Outputter を定義する

出力時に $stdout に設定したクラスの #write メソッドが呼び出されるのでそこに処理を定義してカスタマイズすることができるみたい。

[コード]

class CountOutputter
    def initialize count = 1, output = STDOUT
        @outputter = STDOUT
        @count  = count
    end

    # ナンバリングして出力を行う
    def write output
        return @outputter.write output if output == "\n"
        @outputter.write "#{@count}. #{output}"
        @count += 1
    end
end

outputter = CountOutputter.new
$stdout = outputter

puts "homu"
p "homu"
print "homu"
puts "homu"

[出力]

1. homu
2. "homu"
3. homu4. homu

ちなみに puts 等の改行を含む出力が行われる場合、出力するデータ改行コード とで 計2回 #write メソッドが呼び出されるみたい。