-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]
그러나 그들은 준 나 같은 결과.
왜?
'입술 해시 = [(1..5) .ZIP 5.times.map {[]}]'' – mudasobwa
입술 = {Hash.new는 각 어레이는 다른 객체가 될 것이다 k | h [k] = [] if (1..5) === k}'가 원하는 것을 성취하는 가장 좋은 방법입니다. – mudasobwa
이 정확한 문제와 해결책은 'Array :: new' 문서와 기존의 [so] 질의 응답으로 덮여 있습니다. –