動的なアクセサの追加

rubyでオブジェクトのプロパティに
Obj.propでアクセスするにはアクセサを定義すれば良いが、
そのアクセサを動的に定義したい。
要はActiveRecordのmodelのような事がしたいわけ。

具体的にはコンストラクタのパラメータにhashを与え、
hashが持つキー全てのアクセサを持ったクラスの作成。
調べると instance_eval を使えばいけそうだ。

実装

class MyClass
  def initialize(h = {})
    @attr = h.dup
    h.keys.each do|prop|
      self.instance_eval %Q{
        def #{prop.to_s}
          @attr["#{prop}".intern] || ""
        end
        def #{prop.to_s}=(arg)
          @attr["#{prop}".intern] = arg
        end
      }
    end
  end
end

実験

obj = MyClass.new({:test => "dynamic access"})

puts obj.test

⇒dynamic access


うん。いけてる。