我有一个哈希数组,我宁愿把它变成一个对象数组,其中的属性以编程方式添加到这些对象中。
我现在正试试这个
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"}]}
答案 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)