문제

2010-04-06 5 views
1

루비 1.8.7 (2008-08-11 패치 레벨 72)에는 i586 리눅스] 스크립트/콘솔에서문제

:

>> pairs = Array.new(2).map!{Array.new(2).map!{Array.new(2, Array.new)}} 
=> [[[[], []], [[], []]], [[[], []], [[], []]]] 
>> pair = Pair.first 
=> #<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47"> 
>> pairs[0][0][0] << pair 
=> [#<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">] 
>> pairs[0][0] 
=> [[#<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">], [#<Pair id: 39, charge_card_id: 1, classroom_id: 1, timeslot_id: 1, created_at: "2010-04-01 00:45:37", updated_at: "2010-04-01 00:45:47">]] 
>> 

따라서 문제는 한 쌍의 이유 객체는 쌍으로 나타납니다. [0] [0] [0] 그리고 쌍으로 나타냅니다. [0] [0] [1] 나는 거기에 나타나기를 부탁했습니다. } [0] [0] = pair - 첫 번째 배열 멤버로 원하므로 < < 또는 .push를 사용해야합니다. 나는 그것이 때문이었다 단지 메모리 포인터로 연결하는 깊은 배열의 생각

pairs = Array.new(2).map!{Array.new(2).map!{Array.new(2).map!{Array.new}}} 

:와

답변

3

먼저, 대신 당신은 무엇을 가지고의

pairs = Array.new(2) { Array.new(2) { Array.new(2) { [] }}} 

를 원한다. 두 가지 주요 차이점 :

  • #map! 귀하의 예에서
  • 을 호출하면 "array.new (2, Array.new)"는 하나의 배열을 만듭니다.이 배열은 모두 색인에 사용되므로 동일한 배열을 두 번 참조하게됩니다. 블록 구문을 사용하면 모든 인덱스에 대해 하나의 별도 인스턴스 인 Array를 가질 수 있습니다.
0

Array.new(2, Array.new)은 크기가 2 인 배열을 제공하며 인덱스 0과 인덱스 1에서 동일한 빈 배열 객체의 복사본을 제공합니다. 서로 다른 객체가되도록하려면 더 높은 수준에서 수행 한 것처럼 map!을 사용하십시오 . 모든