0
nodes = {
  :node1 => { 
    :inherits => nil, 
    :variables => { :foo => 1, :bar => 2 } 
  },
  :node2 => { 
    :inherits => :node1, 
    :variables => { :foo => 9, :baz => 4 } 
  }
}

各ノードの :variables ハッシュが :inheritance で指定されたノードの :variables とマージされる新しいノード ハッシュを返す方法を理解しようとしています。つまり、node1 はそのまま残され、node2 は :variabes => { :foo => 9, :bar => 2, :baz => 4 } になります。

私は Enumerable#inject、Hash#merge とブロックなどを含むドキュメントを泳いでおり、助けを求める時が来たと考えています。

アップデート:

私は更新を提供すると考えました。このコードは確かに解決策ではありませんが、正しい方向に向かっている可能性があります...

nodes = {
  :node1 => { :inherits => nil, :variables => { :foo => 1, :bar => 2 } },
  :node2 => { :inherits => :node1, :variables => { :foo => 9, :baz => 4 } }
}

new = nodes.inject({}) do |result, (k, v)|
  result.merge k => v.merge({ :variables => { :a => 6, :b => 7 } })
end

戻り値

{:node2=>{:inherits=>:node1, :variables=>{:a=>6, :b=>7}}, :node1=>{:inherits=>nil, :variables=>{:a=>6, :b=>7}}}

v.merge が意図したとおりに機能しないように...

4

5 に答える 5

1

あなたがしたいHash#merge

merged_variables = nodes[:node1][:variables].merge(nodes[:node2][:variables])
于 2012-10-07T18:49:46.957 に答える
1
nodes[:node2][:variables].replace(
  nodes[:node1][:variables]
  .merge(nodes[:node2][:variables])
)
于 2012-10-07T18:52:57.830 に答える
0

所定の位置にマージすることで少し短くなります。

nodes[:node2][:variables].merge!(nodes[:node1][:variables])

nodes #=> {:node1=>{:inherits=>nil, :variables=>{:foo=>1, :bar=>2}},
      #    :node2=>{:inherits=>:node1, :variables=>{:foo=>1, :baz=>4, :bar=>2}}}
于 2012-10-07T20:43:07.800 に答える
0
merged_nodes = {}

nodes.each do |name, node|
  merged_nodes[name] = node.dup
  merged_nodes[name][:variables] = if node[:inherits]
    nodes[node[:inherits]][:variables].merge node[:variables]
  else
    node[:variables].dup
  end
end

あなたにあげます

{
  :node1=>{:inherits=>nil, :variables=>{:foo=>1, :bar=>2}},
  :node2=>{:inherits=>:node1, :variables=>{:foo=>9, :bar=>2, :baz=>4}}
}

しかし、それはより深いネスティング、つまり if :node3then inherits を処理しません:node2... それと同じくらい複雑なものが必要な場合、このハッシュベースのアプローチはかなりぎこちなくなります。

于 2012-10-07T19:53:41.770 に答える
0
new = {}
nodes.each do |e, v|
    v.each do |attribute, value|
        if attribute == :inherits
            new[e] = value.nil? ? v : nodes[value][:variables].merge( v[:variables] )
        end
    end
end

p new  #=> {:node1=>{:inherits=>nil, :variables=>{:foo=>1, :bar=>2}}, :node2=>{:foo=>9, :bar=>2, :baz=>4}}
于 2012-10-08T07:44:13.777 に答える