2010-04-06 56 views
1

紅寶石1.8.7(2008-08-11 PATCHLEVEL 72)[i586的Linux的]問題的在紅寶石多維數組

從腳本/控制檯:

>> 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] [0] = pair - 我希望它作爲第一個數組成員,所以我需要使用< <或.push。

回答

3

首先,你要

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

,而不是你得到了什麼。兩大主要區別:

  • 你自己救了#map!調用
  • 在您的示例中,「Array.new(2,Array.new)」正在創建一個陣列它用於兩個索引,所以你引用同一個數組兩次。通過使用塊語法,您可以確保對於每個索引,您都有一個單獨的數組實例
0

現在與:

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

我想這是因爲最深陣列只是鏈接到內存的指針。

0

Array.new(2, Array.new)如果你想他們是不同的對象,請使用map!就像你在更高的水平做給你兩個指數在0和1。指數在2大小的數組,用相同的空數組對象的副本。