まず、いくつかのコメント:
あなたのコードは、他のほとんどの人が行うようにインデントされていないため、他の人があなたを助けるのが難しくなっています. 次のようになります。
n_if={}
over_if = arguments[1]
over_if.each do |kk,vv|
weth={}
puts kk,vv,weth
weth = arguments[0]
weth['in_vlan'] = vv['in_vlan']
weth['options']['MTU'] = vv['mtu']
n_if['eth'+ kk.to_s]=weth
end
おそらく、あなたの変数名はあなたには意味がありますが、私には意味がありません. n_if
、weth
、over_if
、kk
および とは何vv
ですか?
weth
内のハッシュに割り当てeach
てから、それを別のものに割り当てます。あなたは本当に何をしようとしていますか?
と言ってarguments[0]
、arguments[1]
ファイルから読み込んだデータです。これらはどのように読み取られますか?これらは YAML ファイルですか? 問題を実際に再現するコードを含めていただけると助かります。必要なものだけをそぎ落とします。
Ruby では、通常、文字列を連結するのではなく、文字列補間を使用する方が慣用的でパフォーマンスが高くなります。
n_if["eth#{kk}"] = weth
さて、いくつかの答え:
私の推測では、あなたのセットアップは次のようなデータを保持していると思います:
arguments = {
"eth_"=>{
"method"=>"static",
"family"=>"inet",
"ip"=>"",
"netmask"=>"255.255.0.0",
"onboot"=>true,
"options"=>{"MTU"=>""},
"in_vlan"=>""
},
"eth_values"=>{
0=>{"mtu"=>1500, "in_vlan"=>15},
1=>{"mtu"=>9000, "in_vlan"=>125}
}
}
arguments[0] = arguments['eth_']
arguments[1] = arguments['eth_values']
私は(あなたが持っているものとあなたが望むかもしれないものに関する多くの推測に基づいて)あなたの問題はこの組み合わせであると信じています:
weth={}
weth=arguments[0]
ここでのあなたの意図は、 "はオブジェクトのハッシュタイプです。 "weth
からの値で埋めてarguments[0]
ください。これらの行が実際に言っていることは次のとおりです。
weth
空のハッシュに設定します。
- 気にしないで、その空のハッシュを捨てて、と同じオブジェクトに設定
weth
してください。arguments[0]
したがって、ループを通過するたびに、同じハッシュを で変更していweth
ます。代わりに、のハッシュを複製したいと思いますweth
。次の変更されたコードは、必要なものを提供しますか?
n_if={}
over_if = arguments[1]
over_if.each do |kk,vv|
weth = arguments[0].dup
weth['in_vlan'] = vv['in_vlan']
weth['options']['MTU'] = vv['mtu']
n_if["eth#{kk}"]=weth
end
require 'pp' # for nice wrapping inspection
pp n_if
#=> {"eth0"=>
#=> {"method"=>"static",
#=> "family"=>"inet",
#=> "ip"=>"",
#=> "netmask"=>"255.255.0.0",
#=> "onboot"=>true,
#=> "options"=>{"MTU"=>9000},
#=> "in_vlan"=>15},
#=> "eth1"=>
#=> {"method"=>"static",
#=> "family"=>"inet",
#=> "ip"=>"",
#=> "netmask"=>"255.255.0.0",
#=> "onboot"=>true,
#=> "options"=>{"MTU"=>9000},
#=> "in_vlan"=>125}}
p arguments
そうでない場合は、質問を編集して、実際に持っているもの (ヒント:結果を見せてください) と、結果として本当に欲しいものについての詳細を記入してください。
編集:楽しみのために、代わりに機能的な変換があります。それがどのように機能するかを理解し、関数型プログラミングのスキルをレベルアップするための演習として読者に残します。eth_values
単純なマージを適用できるように、テンプレートの階層に一致するように変更したことに注意してください。"MTU"=>""
エントリとエントリを残しましたが"in_vlan"=>""
、コードが機能するために必要ではないことに注意してください。両方 (および結果の"options"=>{}
) を削除して、同じ結果を得ることができます。
args = {
"eth_"=>{
"method"=>"static",
"family"=>"inet",
"ip"=>"",
"netmask"=>"255.255.0.0",
"onboot"=>true,
"options"=>{"MTU"=>""},
"in_vlan"=>""
},
"eth_values"=>{
0=>{"options"=>{"MTU"=>1500}, "in_vlan"=>15},
1=>{"options"=>{"MTU"=>9000}, "in_vlan"=>125}
}
}
n_if = Hash[
args['eth_values'].map do |num,values|
[ "eth#{num}",
args['eth_'].merge(values) do |k,v1,v2|
if v1.is_a?(Hash) and v2.is_a?(Hash) then
v1.merge(v2)
else
v2
end
end ]
end
]
pp n_if #=> Same result as in the previous code.