Ruby에서 다차원 배열 초기화

루비의 배열(Array) 초기화 방법은 여러가지가 있습니다만, 크게 Array.new(size, object), Array.new(number) { object } 혹은 [object]*size가 많이 사용됩니다.
일차원 배열인 경우 이들의 차이가 없는 것 같습니다만, 다차원 배열에서는 다음과 같이 차이가 있습니다. Array.new(size, object)와 [object]*size는 한가지 object를 반복해서 사용하게되고 Array.new(number) { object }는 매번 블록이 실행되게 되므로 서로 다른 object를 사용하게 됩니다.
다음과 같은 예를 들수 있겠습니다. 개인적으로 두번째 방법을 자주 사용하는데 다차원 배열을 쓰게 되면 한가지 배열값을 바꾸면 다른 차수의 배열값이 동시에 바뀌는 이상한 동작을 접하게 됩니다.

a = Array.new(4, Array.new(3, Array.new(2, nil)))
=> [[[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]]]
a[0][0][0] = 1
a
=> [[[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]]]
b = [[[nil]*2]*3]*4
=> [[[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]]]
b[0][0][0] = 1
b
=> [[[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]]]
c = Array.new(4) { Array.new(3) { Array.new(2, nil) } }
=> [[[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]]]
c[0][0][0] = 1
c
=> [[[1, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]]]

댓글

이 블로그의 인기 게시물

터미널에서 스칼라 파일 직접 컴파일, 실행

로잉 머신 운동 2달째

curses 라이브러리 간단한 정리