Ruby の refinements を利用してモンキーパッチが適用される範囲を制限する

Ruby 2.1(2.0)で、refinements という機能が実装された。 詳しくはここら辺の記事を参考にしてください。 簡単にいうとモンキーパッチを部分的に適用するための機能です。

今まで

class Array
    # オレオレメソッドを追加する
    def sum
        inject :+
    end
end

puts [1, 2, 3].sum
# => 6

refinements を使う

# Array に直接追加するのではなく、module + refine を使用して定義する
module ArrayEx
    refine Array do
        def sum
            inject :+
        end
    end
end

# error : undefined method `sum'
# puts [1, 2, 3].sum

# モンキーパッチを適用したい場合 using + Module 名で使用できるようになる
# using の適用範囲はそのスコープ内でのみ有効になる(ファイルはまたがない
using ArrayEx

puts [1, 2, 3].sum
# => 6

こんな感じで refinements を使用することでより安全にモンキーパッチを使用することができるみたい。

ちなみに 2.0 でも refinements は使用できるが、まだ実験的な実装みたいでトップレベルのスコープでしか using はできないらしい。

これは正式に導入された 2.1 にてトップレベル以外のスコープでも using を行うことができるようになった。

参照