2014-04-23 4 views
0

키가 문자열이고 값이 배열 인 해시를 갖고 싶습니다. 나는 다음과 같은 방법으로 시도했다 :배열을 루비의 해시 값으로 배열

h = Hash.new([]) # => {} 
h["one"]   # => [] 
h["two"]   # => [] 
h["one"].push 1 # => [1] 
h["one"]   # => [1] 
h["two"]   # => [1] //why did it assign it to h["two"] also?? 

올바른 방법은 무엇입니까?

+0

올바른 방법입니다. – sawa

+0

가능한 복제본 [배열을 Ruby 해시의 기본값으로 사용할 수 없습니까?] (http://stackoverflow.com/questions/5488853/cant-use-an-array-as-default-values-for-ruby- 해시시) –

답변

3

:

h = Hash.new { |h,k| h[k] = [] } 
h['one'] 
h 
# => { 'one' => [] } 
h['two'] << 12 
h 
# => { 'one' => [], 'two' => [12] } 

더 자세한 어느

모든 단일 해시 키를 초기화됩니다 기본 값을 설정하는 올바른 방법은 블록을 사용하는 것입니다 그리고 (IMO) 더 좋네.

4

new 메서드로 전달 된 [] 메서드는 복사되지 않고 설정되지 않은 모든 해시 키에서 참조되므로이 동작이 발생합니다. 따라서 h['one']h['two']과 동일한 개체를 참조합니다. 따라서 h['one'] (push 메서드 사용)으로 참조되는 개체를 수정하면 h['two']도 수정됩니다. 나는 보통 이런 식으로 할

h = Hash.new { |hash, key| hash[key] = [] } 
관련 문제