첫째, 일부 의견 :
귀하의 코드가 다른 사람들이 당신을 도와하는 것이 어렵게 대부분의 다른 사람들이 그것을 할 수있는 방법에 들여 쓰기되지 않습니다. 그것은 다음과 비슷한 모습이 될 것입니다
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
은 무엇입니까?
each
안에 weth
을 해시로 지정한 다음 다른 것으로 지정합니다. 너 정말로 무엇을하려고하는거야?
arguments[0]
과 arguments[1]
은 파일에서 읽은 데이터라고 말합니다. 어떻게 읽습니까? YAML 파일입니까? 실제로 문제를 재현 할 수있는 코드가 포함되어 있다면 도움이 될 것입니다. 그것을 본질에 맞추십시오.
루비에서
는 문자열을 연결하는 것이 아니라 문자열 보간 사용하지 않는 것이 일반적으로 더 관용적 및 확대됨입니다 : 이제
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
에 duplicate the hash을 입력하고 싶습니다. 다음 수정 된 코드가 필요한 것을 제공합니까? (: p arguments
을 우리에게 결과를 보여 힌트) 그리고 당신이 정말 결과로 원하는을
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}}
그렇지 않으면, 당신이 실제로 무슨에 대한 자세한 정보와 질문을 수정하시기 바랍니다.
편집은 : 재미, 여기 대신에 기능적인 변화입니다. 그것은 어떻게 작동하는지 이해하고 그들의 기능적 프로그래밍 기술을 높이기 위해 독자에게 운동으로 남아 있습니다. 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.
자세히 알아보기 전에 코드 형식을 지정하는 방법을 배우십시오. 도움을 받기 쉽습니다. https://github.com/styleguide/ruby –
해시와 같은 예상 또는 실제 모습이 아닌 문자열입니다. 'p n_if' 또는'puts n_if.inspect'를 사용하여 사람이 읽을 수있는 형식의 내용을 볼 수 있습니다. (나는 당신이 채우려 고 시도한 해시라고 가정하고 있습니다.) – Phrogz
또 다른 중요한 사항은 : 특히 시작한 순간에 여러 줄의 코드를 작성할 수 있다고 기대하지 말고 모든 것이 작동하도록하십시오. 예상대로 * 하나의 작은 코드를 작성하고 작동하는지 확인한 후 다음 단계를 작성하십시오. * 시작하려는 작업으로 다시 시작하십시오. 가능한 한 가장 작은 부분을 시도해보십시오. 그런 다음 걸려 넘어지면 문제가 무엇인지 정확하게 알 수 있습니다. –