0

名前と値のペアのハッシュがあります。

attr_hash = {"attr1"=>"val1","attr2=>"val2"}

これらの値のそれぞれを循環させて、次のようにオブジェクトに割り当てたいと思います。

thing = Thing.new
attr_hash.each do |k,v|
  thing.k = v
end

class Thing
   attr_accessor :attr1, :attr2
end

もちろん、問題は attr1 と attr2 が文字列であることです..だから私は次のようなことはできませんthing."attr1"

私はやってみました: thing.send(k,v)しかし、それはうまくいきません

4

3 に答える 3

4

thing.send("#{k}=", v)代わりに使用してください。

于 2013-11-05T23:58:17.790 に答える
1

setter メソッドを呼び出す必要があります。これは、呼び出される属性の場合nameは になりますname=。あなたの例に続いて:

attr_hash.each do |k,v|
  thing.send("#{k}=", v)
end

また、このハッシュが何らかの形でユーザーからのものである場合は、呼び出す前にセッターが存在するかどうかを以下を使用してテストすることをお勧めしますrespond_to?

attr_hash.each do |k,v|
  setter = "#{k}="
  thing.send(setter, v) if thing.respond_to?(setter)
end
于 2013-11-05T23:59:09.730 に答える