Проблема с многомерными массивами в ruby - PullRequest
1 голос
/ 06 апреля 2010

ruby ​​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], несмотря на то, что я не просил его там появляться.Обратите внимание, что я не нуждаюсь в pair [0] [0] [0] = pair - я хочу использовать его как первый элемент массива, поэтому мне нужно использовать << или .push. </p>

Ответы [ 3 ]

3 голосов
/ 06 апреля 2010

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

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

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

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

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

0 голосов
/ 06 апреля 2010

Теперь работает с:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...