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"

したがって、1つには、正しい方法は

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

ハッシュを変換したく#eachないためではなく、使用していることに注意してください。#collect

また、例がハッシュの配列を単一のOpenStructに変換するという最終目標を反映している場合は、すべてのハッシュを1つに結合して、次のように渡すことができますOpenStruct.new

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