2013-03-25 3 views
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 

데이터가이 개 파일에서 읽혀질하고, [1] 각각 인수 [0]과 인수로 전달 :

# 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 

내 실수는 무엇입니까?

+2

자세히 알아보기 전에 코드 형식을 지정하는 방법을 배우십시오. 도움을 받기 쉽습니다. https://github.com/styleguide/ruby –

+1

해시와 같은 예상 또는 실제 모습이 아닌 문자열입니다. 'p n_if' 또는'puts n_if.inspect'를 사용하여 사람이 읽을 수있는 형식의 내용을 볼 수 있습니다. (나는 당신이 채우려 고 시도한 해시라고 가정하고 있습니다.) – Phrogz

+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_if, weth, over_if, kkvv은 무엇입니까?

  3. each 안에 weth을 해시로 지정한 다음 다른 것으로 지정합니다. 너 정말로 무엇을하려고하는거야?

  4. arguments[0]arguments[1]은 파일에서 읽은 데이터라고 말합니다. 어떻게 읽습니까? YAML 파일입니까? 실제로 문제를 재현 할 수있는 코드가 포함되어 있다면 도움이 될 것입니다. 그것을 본질에 맞추십시오.

    루비에서
  5. 는 문자열을 연결하는 것이 아니라 문자열 보간 사용하지 않는 것이 일반적으로 더 관용적 및 확대됨입니다 : 이제

    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으로 동일한 해시를 수정한다. 대신 wethduplicate 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. 
+0

두 개의 해시를 병합하는 방법을 보여주는 맨 아래의 기능적 대답을 추가했습니다 (해시 하위에 병합의 한 수준 지원). – Phrogz

+0

@awesome 설명 :) –