0

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

我正在尝试这个

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"}]}
4

1 回答 1

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因为我们不想转换哈希。

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

h = resulthash["users"].inject({}) { |acc, v| acc.merge(v) }
obj = OpenStruct.new(h)
于 2012-03-03T14:15:36.753 回答