2016-04-20 3 views
0

Если я сделать следующее:Как изменить позиции в двухмерном массиве?

table = Array.new(
    3, 
    Array.new(
    3, 
    nil 
) 
) 

# => 
    [ 
    [nil, nil, nil], 
    [nil, nil, nil], 
    [nil, nil, nil] 
    ] 

Теперь я хотел бы изменить значение по индексу 2 во втором массиве, так что я хотел бы сделать:

table[1][2] = 2.343 

Теперь я бы ожидал увидеть:

# => 
    [ 
    [nil, nil, nil], 
    [nil, nil, 2.343], 
    [nil, nil, nil] 
    ] 

Однако то, что я получаю это:

[ 
    [nil, nil, 2.343], 
    [nil, nil, 2.343], 
    [nil, nil, 2.343] 
] 

Что я не получу здесь?

PS: Запуск рубин 2,3

ответ

2

Для исправления с поведением, попробуйте следующее:

empty_table = Array.new(3) { Array.new(3) } 

От руководства массива:

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

0

вы, по сути говоря, создать массив с тремя элементами, и поставить этот элемент (новый массив) в каждом пространстве. Элемент, который вы помещаете в первый массив, создается только один раз. Единственный способ, которым я знаю делать то, что вам нужно, - это использовать цикл for, чтобы выталкивать столько новых массивов в первый массив, сколько вам нужно. что-то вроде этого:

table = Array.new(1, Array.new(3, 0)) 
0..1.each do |i| 
    table.push(Array.new(3, 0)) #add two more arrays to the first dimension 
end 
Смежные вопросы