如何以编程方式向对象添加属性?

时间:2012-03-03 13:40:50

标签: ruby openstruct

我有一个哈希数组,我宁愿把它变成一个对象数组,其中的属性以编程方式添加到这些对象中。

我现在正试试这个

obj = OpenStruct.new

resulthash["users"].collect { |u|
  u.each do |k,v|
    obj.send("#{k}=#{v}");
  end
}

回顾一下我正在尝试

obj.foo = "bar"
obj.hello = "world"

但是以编程方式,例如,如果数组/哈希看起来喜欢这个

{"users"=>[{"foo"=>"bar","hello"=>"world"}]}

1 个答案:

答案 0 :(得分:5)

Object#send将方法名称作为第一个参数,并将可选参数作为剩余参数传递给方法。

因此,obj.send("#{k}=#{v}")确实尝试调用名为"foo=bar"的方法,这与使用参数foo=调用"bar"不同。

所以对于一个人来说,正确的方法是

resulthash["users"].each { |u|
  u.each do |k,v|
    obj.send("#{k}=", v)
  end
}

请注意,我使用的是#each而不是#collect,因为我们不想转换哈希。

此外,如果您的示例反映了将Hashes数组转换为单个OpenStruct的最终目标,则可以将所有Hashes合并为一个并将其传递给OpenStruct.new

h = resulthash["users"].inject({}) { |acc, v| acc.merge(v) }
obj = OpenStruct.new(h)