3

私は初心者です。お願い助けて。私はパペット関数のコードを書きます:

    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

2 つのファイルから読み取られ、それぞれ引数 [0] と引数 [1] に渡されるデータ:

# template of ethernet interfaces
eth_: 
  method: "static"
  family: "inet"
  ip: ""
  netmask: "255.255.0.0"
  onboot:  true
  options: 
    MTU: ""
  in_vlan: ""

# values for include into ethernet interfaces
eth_values:
 0:
  mtu: 1500
  in_vlan: 15
 1:
  mtu: 9000
  in_vlan: 125

次のように、キー「eth0」と「eth1」でハッシュを取得することを期待しています。

eth1methodstaticfamilyinetin_vlan125ipnetmask255.255.0.0onboottrueoptionsMTU9000eth0methodstaticfamilyinetin_vlan15ipnetmask255.255.0.0onboottrueoptionsMTU1500

しかし、私は得る:

eth1methodstaticfamilyinetin_vlan125ipnetmask255.255.0.0onboottrueoptionsMTU9000eth0methodstaticfamilyinetin_vlan125ipnetmask255.255.0.0onboottrueoptionsMTU9000

私の間違いは何ですか?

4

1 に答える 1

1

まず、いくつかのコメント:

  1. あなたのコードは、他のほとんどの人が行うようにインデントされていないため、他の人があなたを助けるのが難しくなっています. 次のようになります。

    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
    
  2. おそらく、あなたの変数名はあなたには意味がありますが、私には意味がありません. n_ifwethover_ifkkおよび とは何vvですか?

  3. weth内のハッシュに割り当てeachてから、それを別のものに割り当てます。あなたは本当に何をしようとしていますか?

  4. と言ってarguments[0]arguments[1]ファイルから読み込んだデータです。これらはどのように読み取られますか?これらは YAML ファイルですか? 問題を実際に再現するコードを含めていただけると助かります。必要なものだけをそぎ落とします。

  5. 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.
于 2013-03-25T13:52:36.280 に答える