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はけっこう前に読んだんだけど、やっぱり実戦する場面がないと身につかないなあ。