動的にメソッドを生成する

メモです.

Module#define_methodを使用する.

ソースコード

class MyClass

  def self.create_methods(method_names)
    method_names.each do |n|
      define_method "get_#{n}" do |p|
        "#{p}さん,#{n}です,おぼえてますか?"
      end
    end
  end

  define_method :get_c do |p|
    "#{p}さん!?"
  end

end

method_names = ["a", "b"]
MyClass.create_methods(method_names)

c = MyClass.new
puts c.get_a("Ruby")  # => Rubyさん,aです,おぼえてますか?
puts c.get_b("JS")    # => JSさん,bです,おぼえてますか?
puts c.get_c("Rails") # => Railsさん!?

define_methodを使う箇所は,行3のようにメソッド内の場合はselfなメソッドでなければならなかった.define_methodがModuleクラスのプライベートメソッドだからだろうか?

別の方法としては,行18のメソッド定義のdefと同レベルの位置(なんていうスペースなんだろう?)でもできる.