【问题标题】:How to programmatically add attributes to objects?如何以编程方式向对象添加属性?
【发布时间】:2012-03-03 13:40:49
【问题描述】:

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

我正在尝试这个

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

【问题讨论】:

    标签: ruby openstruct


    【解决方案1】:

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

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

    因此,正确的方法是

    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)
    

    【讨论】:

    • 帮了很多忙,最后我遍历了数组,创建了一个新的 OpenStruct 并将其添加到数组中。
    猜你喜欢
    • 2018-12-06
    • 2014-06-11
    • 1970-01-01
    • 2022-12-23
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多