2012-03-23 2 views
0
a = Array.new(3,[]) 
a[1][0] = 5 
a => [[5], [5], [5]] 

나는 이것이 의미가 없다고 생각했습니다! 은 [=], [5], []] 또는이 종류의 루비 기능이 아니어야합니까?배열 배열에서 하나의 배열을 변경하면 모두 변경됩니다. 왜?

+0

http://stackoverflow.com/questions/4642395/in-ruby-why-does-array-newsize-object-create-an-array-consisting-of-multiple 및 http : // stackoverflow도 참조하십시오. ruby-array-creation-array-new-vs/4601727 # 4601727 – Phrogz

답변

4

사용이 대신 : 같은 객체는 각 항목의 값에 사용되는 코드와

a = Array.new(3){ [] } 

; 하나의 참조를 변경하면 다른 모든 참조가 변경됩니다. 위의 경우 새 값이 필요할 때마다 블록을 호출합니다.이 때마다 새 배열 을 반환합니다. gsub 방법이 있나이다 발생하기 전에 위의 문자열 보간에서

str.gsub /(<([a-z]+)>/, "-->#{$1}<--" 

:


예상대로 작동하지 않는 다음과 같은 이유에 대해 새 사용자의 질문에 본질적으로 유사하다 호출하므로 해당 문자열의 현재 값인 $1을 사용할 수 없습니다. 마찬가지로, 당신의 질문에 객체를 생성하고 Array.new에 전달하기 전에 루비가 배열 슬롯을 만들기 시작합니다. 네, 런타임 일 수 있습니다. 기본적으로이 항목에 dup으로 전화를 걸 수 있습니다. 그러나 이는 잠재적으로 재앙과 속도가 느립니다. 따라서 블록 양식을 통해 초기 값을 만드는 방법을 스스로 결정할 수 있습니다.

+2

약간의 nitpick : "한 번 돌연변이시킨 인스턴스 중 하나를 돌연변이시킨 경우"- 실제로 인스턴스가 하나 밖에 없다. 정확하게 문제! –

+0

그 말은 좋지 않았습니다. 감사. 나는 그것을 바꿨다. – Phrogz

관련 문제