2014-04-12 8 views
-1

다음과 같은 현상이 발생합니다. 첫 번째 하위 배열의 첫 번째 하위 요소에만 각 하위 배열의 첫 번째 요소가 아닌 "x"이 할당 될 것으로 예상됩니다. 아무도이 동작을 설명 할 수 있을까요, 아마도 그것을 해결하는 방법? (이 잘 동작을 예상 할 수 있습니다,하지만이 경우, 내 기대를 모순.)Ruby 2D 배열 할당 가능한 버그?

x = Array.new(3, Array.new(5)) 
# => [[nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil]] 
x[0][0] # => nil 
x[0][0] = "x" 
x 
# => [["x", nil, nil, nil, nil], ["x", nil, nil, nil, nil], ["x", nil, nil, nil, nil]] 
+0

2d_array = Array.new (행) {Array.new (열)} –

+3

이 당신이 문서 : –

+0

-1을 간과 .. 버그가 아닙니다. 질문이 명확하지 않습니다. 버그는 어디에 있습니까? 아마도 당신의 두뇌에? 먼저 쓴대로 왜 기대하는지 설명해야합니다. – sawa

답변

5

해결 방법은 다음과 같습니다

x = Array.new(3) { Array.new(5) } 
x[0][0] = 'a' 
x # => [["a", nil, nil, nil, nil], [nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil]] 

new(size) {|index| block }

의 배열 주어진 크기가 생성됩니다. 이 배열의 각 요소는 요소의 인덱스를 지정된 블록에 전달하고 반환 값을 저장하여 만들어집니다.

읽기 또한 Common gotchas

두번째 파라미터를 전송하는 동일한 개체의 모든 배열 요소의 값으로 사용될 것이다. 모든 배열 요소는 동일한 배열 Array.new(5)을 저장하기 때문에 그 중 하나에 대한 변경 사항은 모두 영향을줍니다.

여러 복사본을 원하는 경우 배열의 요소를 초기화해야 할 때마다 해당 블록의 결과를 사용하는 블록 버전을 사용해야합니다.

+1

+1 나를 ..... 당신은 배열과 해시 사랑 :) –

+1

@ AlokAnand 다음 주에 올거야, 우리는 만날 것이다 .. :) –

+0

확실히, 우리는 만날 것이다. –

0
2d_array = Array.new(rows) { Array.new(columns) }