2015-07-08 4 views
2

В частности, мне интересно, почему, когда я создаю новый массив с несколькими под-массивами с использованием .fill, подмассивы, созданные с использованием .fill, являются одним и тем же объектом.Как использовать метод .fill для создания новых объектов?

array = Array.new.fill([], 0..8) 

subsquare[0].object_id => 7220340 
subsquare[1].object_id => 7220340 

Как создать эти подмассивы, гарантируя, что каждый вспомогательный массив является его собственным объектом?

ответ

3

почему на этот вопрос можно найти, если вы посмотрите на Array.new: http://ruby-doc.org/core-2.2.0/Array.html

Обратите внимание, что второй аргумент заполнит массив со ссылками на тот же объект. Поэтому рекомендуется только в случаях, когда вам необходимо создать экземпляры массивов с неизменяемыми объектами, такими как Символы, цифры, истина или ложь.

Чтобы создать массив с отдельными объектами, вместо этого можно передать блок . Этот метод является безопасным для использования с изменяемыми объектами, такие как хэш, строка или других массивы

Обходным, как указано в документе является:

array = Array.new(8) { [] } 
Смежные вопросы