Rubyのクラスに動的にクラスメソッドを追加する

クラスの特異クラスにメソッドを追加すればクラスメソッドを追加できる。

class Hoge
  class << self
    ["method_a", "method_b"].each do |method_name|
      define_method method_name do |param|
	    "#{param} was passed to #{method_name}"
      end
    end
  end
end

クラス定義外で以下のようにしても同じ。

class << Hoge
  ["method_a", "method_b"].each do |method_name|
    define_method method_name do |param|
      "#{param} was passed to #{method_name}"
    end
  end
end

理屈としては

  • クラスメソッドはクラスの特異メソッドである
  • 特異メソッドはオブジェクトの特異クラスのメソッドである
  • つまりクラスの特異クラスのメソッドはクラスメソッドである

という三段論法。
ううん、知らないけどきっとそう。

特異クラスが理解できてないと訳がわからなすぎですね。
メタプログラミングRubyを読みましょう。(と言ってる自分も正直まだ理解が曖昧なので同書を読み返しながらこれを書いてるわけだけど)

class << some_object
  #...
end

はオブジェクトの特異クラスのスコープに入る記法。

eigenclass = class << some_object; self; end

で特異クラスの参照を取得することもできる。

メタプログラミングRubyはけっこう前に読んだんだけど、やっぱり実戦する場面がないと身につかないなあ。

前の記事

CommonJSスタイルがいいらしい