Ruby で #to_s を定義しないで標準出力をカスタマイズする

前回は #to_s を定義して標準出力をカスタマイズしたのですが、#to_s を定義しないで標準出力をカスタマイズしてみました。

[コード]

# #to_stdout が定義されていればその戻り値を標準出力する
module Output
    def puts output
        if output.respond_to? :to_stdout
            super output.to_stdout
        else
            super output
        end
    end
end


module Kernel
    prepend Output
end
include Kernel


class Person
    def initialize name, age
        @name, @age = name, age
    end

    def to_stdout
        "name : #{@name}, age : #{@age}"
    end
end


homu = Person.new "homu", 14
puts homu
puts "mami"

[出力]

name : homu, age : 14
mami

やってることは至極簡単で、Kernel#puts を再定義しています。
出力するオブジェクトが #to_stdout メソッドを定義していればそのメソッドの結果を出力します。
ここら辺の拡張性があるのは Ruby の利点ですね。