2011-03-12 3 views
4

배열의 모든 객체가 원본의 'dup'이되도록 중첩 된 Array를 복사하는 쉬운 방법이 있습니까? 나는 최근에이로 실행 : a에서 배열의 첫 번째 수준은 개별 개체 동안 중첩 된 배열을 복사하고 복사본이 원본의 전체 집합체가되도록하는 방법

irb(main):001:0> a = [[1,2],[3,4]] 
=> [[1, 2], [3, 4]] 
irb(main):002:0> b = a.dup 
=> [[1, 2], [3, 4]] 
irb(main):003:0> a[0][1] = 99 
=> 99 
irb(main):004:0> a 
=> [[1, 99], [3, 4]] 
irb(main):005:0> b 
=> [[1, 99], [3, 4]] 
irb(main):006:0> a[0] = [101,102] 
=> [101, 102] 
irb(main):007:0> a 
=> [[101, 102], [3, 4]] 
irb(main):008:0> b 
=> [[1, 99], [3, 4]] 

그래서, 그 내용은 아니었다, a[0][1] 여전히 b[0][1]과 같다. 일반적인 솔루션은 배열이 얼마나 깊이 중첩되어 있는지조차 알 필요가 없습니다. 모든 물체를 걸 으면 그 자체로 하나의 덩어리가되어 버립니다.

+0

이상적인 세계에서는 개체를 수정하지 않기 때문에 복제 할 필요가 없습니다. 그러나 개체 수정이 진행되는 기존 앱으로 작업하는 경우 이는 정당한 질문입니다. –

+0

나는 배열의 한 값이 이전 값에 의존하고 계산이 몇 번 반복되는 일부 혼란스러운 함수 시각화 작업을하고 있습니다. 나는 전체 배열 레벨 (가시 영역을 나타냄)에서 계산 원자를해야만한다. 그래서 나는 2 개의 배열을 가지며, 처음부터 계산을하고 두 번째 (같은 위치에)에 결과를 놓는다. 현재의 반복이 끝나면, 필자는 'present'배열을 'previous'배열로 만들어야한다. 이것은 간단한 파스칼 형 배열 복사가 필요할 때이다. – karatedog

답변

3
b = Marshal.load(Marshal.dump(a)) 
+0

감사합니다. 나는 결코 그것을 생각하지 않았을 것이다. – karatedog

관련 문제