2010-04-06 4 views
1

рубин 1.8.7 (2008-08-11 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] = пара. Я хочу, чтобы это был первый элемент массива, поэтому мне нужно использовать < < или .push.

ответ

3

Прежде всего, вы хотите

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

вместо того, что вы получили. Два основных отличия:

  • Вы экономитесь на # карте! вызывает в вашем примере
  • , «Array.new (2, Array.new)» создает один массив, который используется для обоих индексов, так что вы имеете в виду тот же массив в два раза. Используя синтаксис блока, вы гарантируете, что для каждого индекса у вас есть один отдельный экземпляр Array
0

В настоящее время работает с:

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

Я думаю, что это из-за глубоких массивов было только ссылки на указатель памяти.

0

Array.new(2, Array.new) дает массив размером 2 с копией того же пустого объекта массива как с индексом 0, так и с индексом 1. Если вы хотите, чтобы они были разными объектами, используйте map!, как вы делали на более высоких уровнях ,

Смежные вопросы