2016-09-27 3 views
-2

배열의 해시를 만들고 싶습니다.생성 된 개체 간의 연결을 끊는 방법

내가 할 경우이 :

res = Hash[(1..5).zip Array.new(5, [])] 

나는 결과로이 얻을 것이다 :

{1=>[], 2=>[], 3=>[], 4=>[], 5=>[]} 

그것은 괜찮습니다. 그러나이 배열 중 하나를 변경하려고하면 Ruby가 모두 변경되며, 그렇지 않습니다.

내가 이렇게 할 경우 :

res[1] << 1 

나는 결과로이 얻을 것이다 :

{1=>[1], 2=>[1], 3=>[1], 4=>[1], 5=>[1]} 

내가 같은 다른 변종을 사용하려고 시도했다 :

res = Hash[(1..5).zip Array.new(5, Array.new)] 
res = Hash[(1..5).zip Array.new(5, [].dup)] 
res = Hash[(1..5).zip Array.new(5, [].clone)] 
res = Hash[(1..5).zip Array.new(5, []).clone] 

그러나 그들은 준 나 같은 결과.

왜?

+0

'입술 해시 = [(1..5) .ZIP 5.times.map {[]}]'' – mudasobwa

+0

입술 = {Hash.new는 각 어레이는 다른 객체가 될 것이다 k | h [k] = [] if (1..5) === k}'가 원하는 것을 성취하는 가장 좋은 방법입니다. – mudasobwa

+2

이 정확한 문제와 해결책은 'Array :: new' 문서와 기존의 [so] 질의 응답으로 덮여 있습니다. –

답변

2

블록을 Array.new 메소드로 전달하면 다른 오브젝트 ID를 갖는 요소를 가져올 수 있습니다. H, |

res = Hash[(1..5).zip(Array.new(n){[]})] 
관련 문제