fv17の日記 - Coding Every Day

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

Ruby - Refinementsとは

書籍「メタプログラミング Ruby」の写経兼復習用。

Refinementsとは、Rubyにおけるオープンクラスのスコープを特定の範囲に限定するもの。

具体的に見ていくと、下記のようなオープンクラスを用いた場合、その影響範囲はアプリケーション全体となり、予期せぬところでコードを破壊するなどの危険性があった。

class String
  def to_alphanumeric
    gsub(/[^\w\s]/, '')
  end
end


そのため、Refinementsによりオープンクラスの効果範囲を特定のモジュールだけに限定できるようにした。下記のように、refine クラス名 do ... end の形式で宣言し、モジュール内でusingすることでオープンクラスの効果を限定することができる。

module StringExtentions
  refine String do
    def to_alphanumeric
      gsub(/[^\w\s]/, '')
    end
  end
end

module SomeModule
  using StringExtentions
  "#3, the *Magic, Number*?".to_alphanumeric # => "3 the Magic Number"
end