2010-04-06 53 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大小的数组,用相同的空数组对象的副本。