2

Ohm オブジェクトのフィールドを動的に設定するにはどうすればよいですか?

class OhmObj < Ohm::Model
  attribute :foo
  attribute :bar
  attribute :baz

  def add att, val
    self[att] = val
  end
end

class OtherObj

  def initialize
    @ohm_obj = OhmObj.create
  end

  def set att, val
    @ohm_obj[att] = val #doesn't work
    @ohm_obj.add(att, val) #doesn't work
  end 
end
4

2 に答える 2

3

fromのattributeクラス メソッドOhm::Modelは、名前付き属性のアクセサ メソッドとミューテータ メソッドを定義します。

def self.attribute(name)
  define_method(name) do
    read_local(name)
  end

  define_method(:"#{name}=") do |value|
    write_local(name, value)
  end

  attributes << name unless attributes.include?(name)
end

したがって、 と言うとattribute :foo、これらのメソッドを無料で取得できます。

def foo         # Returns the value of foo.
def foo=(value) # Assigns a value to foo.

send次のように mutator メソッドを呼び出すために使用できます。

@ohm_obj.send((att + '=').to_sym, val)

本当に言いたい場合は、クラス@ohm_obj[att] = valに次のようなものを追加できます。OhmObj

def []=(att, value)
    send((att + '=').to_sym, val)
end

また、対称性を維持するために、おそらくアクセサーのバージョンも必要になるでしょう。

def [](att)
    send(att.to_sym)
end
于 2011-07-10T01:23:23.463 に答える
0

[]また[]=、動的属性アクセサとミューテータとして、Ohm 0.2 の Ohm::Model でデフォルトで定義されています。

于 2011-09-11T11:45:36.903 に答える