読者です 読者をやめる 読者になる 読者になる

Ruby で動的に refine を定義する

Ruby で refinements を利用すると次のようにクラス拡張を特定の範囲でのみ適用させることができます。

module StringEx
    refine String do
        def twice
            self + self
        end
    end
end

using StringEx

p "homu".twice
# => "homuhomu"

上記の場合は StringEx モジュールを定義してそれを using しているのですが、次のようにして無名モジュールを定義することも出来ます。

using Module.new {
    refine String do
        def twice
            self + self
        end
    end
}

p "homu".twice
# => "homuhomu"

局所的にクラス拡張を行ないたい場合に便利。