define_methodで動的にインスタンスメソッドを定義する

いつも忘れるのでメモ

Rubyでクラスに動的にインスタンスメソッドを定義したい場合、 define_methodというModuleクラスのメソッドを利用する。

Module – Rubyリファレンスマニュアル

インスタンスメソッド name を定義します。 method には Proc、Method あるいは UnboundMethod のいずれかのインスタンスを指定します。 引数 method を与えたときはそれを、ブロック付きで 呼びだしたときはブロックを Proc 化したオブジェクトを、 それぞれ返します。

例えば名前だけ微妙に違う、同じような処理だけど別々のメソッドとしておきたい場合など Railsやっているとしばしばある。

とりあえずサンプル書いてみます

サンプル

class DynamicMethod
  # my_method_1, my_method_2というメソッドを定義する
  [1,2].each do |num|
    define_method("my_method_#{num}") do |message| # 引数message
      puts "My method #{num}:#{message} "
    end
  end
end

dm = DynamicMethod.new
p dm.methods.select{|i| i=~/my_method/} # => ["my_method_1", "my_method_2"]

dm.my_method_1 "hello"    # => My method 1:hello
dm.my_method_2 "good-bye" # => My method 2:good-by

うーん、なんて簡単なんだ。

関連記事

  1. Fixtureのhas_manyでこんな書き方したい
  2. [ruby][flex] Socketサーバを書いてみた
  3. [Ruby] 集合知プログラミング 03
Posted in ruby, 日記 at 1月 31st, 2009. Trackback URI: trackback

No Responses to “define_methodで動的にインスタンスメソッドを定義する”

Leave a Reply