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 を行うことができるようになった。