2011-08-25 2 views
2

Ruby (1.8)에서 비슷한 것을 어떻게 할 수 있습니까? 내 목표는 변수를 할당하는 해시 키의 변수를 사용하는 것입니다.Ruby에서 중첩 해시에 동적 변수 이름을 사용하는 방법은 무엇입니까?

@keys="" 
my_hash = Hash.new { |h,k| h[k]=Hash.new(&h.default_proc) } 

line="long:keys:are:here:many:of:them:dont:know:how:much" 

line.split(':').each { |x| 
    @[email protected]+'["'+x+'"]' 
} 

my_hash#{@keys}=1 

#I would like to assign a variable for the following. 
# my_hash["long"]["keys"]["are"]["here"]["many"]["of"]["them"]["dont"]["know"]["how"]["many"]=1 
+0

: (당신이 요청에 따라 마지막 1 인으로, 당신은 모든 subhashes에 포인터를 찾고 있었다 즉 큰 해시)이 출력을 생성

hash = {} line="long:keys:are:here:many:of:them:dont:know:how:much" current_depth = hash subhash_pointers = [] line.split(':').each { |x| current_depth[x] = {} current_depth = current_depth[x] subhash_pointers << current_depth } puts hash.inspect subhash_pointers[-1] = 1 puts subhash_pointers.join(' ') 

"동적 변수 이름"을 사용하지 말고 제공된 원칙을 사용하십시오. 'hashN [keyN] = valueN'과'hashN + 1 = valueN' 행을 구문 분석 할 때 "chain"을 빌드합니다. 다른 사람들은'inject'라는 작은 예제를 제공 할 것입니다. –

+0

이것이 당신이 원하는 것입니까? "long : keys : are : 여기 : many of :"로 지정하면 그 아래 모든 것을 지울 것입니다. 확실하다면 "자동 노출"(예 : http://stackoverflow.com/search?q=%5Bruby%5D+autovivification)을 찾으십시오. –

+0

청구서, 좋은 지적입니다. 전체 코드를 공유하지는 않았지만 키의 일부가 이미 존재하는지 확인하고 싶습니다. – Istvan

답변

1

각 항목에 대해 새 해시를 만들고 이전 해시에 넣는 항목을 반복합니다. 변수를 마지막에 할당하고 싶으므로 변수를 생성 할 때 각 변수에 대한 포인터를 유지할 수 있고, 모두 가지고 있다면 마지막 포인터를 가리키는 포인터를 가질 수 있습니다. 코드는 다음과 같습니다

{"long"=>{"keys"=>{"are"=>{"here"=>{"many"=>{"of"=>{"them"=>{"dont"=>{"know"=>{"how"=>{"much"=>{}}}}}}}}}}}} 

keysareheremanyofthemdontknowhowmuch areheremanyofthemdontknowhowmuch heremanyofthemdontknowhowmuch manyofthemdontknowhowmuch ofthemdontknowhowmuch themdontknowhowmuch dontknowhowmuch knowhowmuch howmuch much 1 
+0

Chris 나는이 권리가 있다고 100 % 확신하지는 않지만 결국 코드에서 찾고자하는 값으로 해시를 생성하지 않습니다. – Istvan

관련 문제