Hatena::ブログ(Diary)

guccyonikki このページをアンテナに追加 RSSフィード

2007-11-28

動的なアクセサの追加

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


うん。いけてる。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/guccyon/20071128/p2