Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Module#const_missingを使って、未定義な定数に対する動作を定義する

Module#const_missingは、未定義な定数を参照した際に呼び出されるメソッドです。
こんな感じで使います。

class Test1
  def Test1.const_missing(name)
    mapping = {
      /^Func(\d+)$/ => :func
    }

    mapping.each_pair do |rgx, args|
      if rgx =~ name.to_s
        return "Defined!"
      end
    end
  end
end

p Test1::Func1

これを呼び出すと

$ ruby const_missing.rb
"Defined!"

てな感じで、出力されます。

実用的な話

とはいえ、単に文字出すだけでは何の旨味も無いです。
実際には、ここでmodule_evalやclass_evalで子分クラスを作成する用途でつかいます。

例えばBindataでは、2ビットやら7ビットのメソッドを生成する際に活用しています
メタプログラミング……コワイ!