2015-01-10 2 views
4

В чем разница между этими двумя заданиями? Почему у них разные результаты?Почему существуют разные результаты при назначении значения в двухмерном массиве?

arr3 = Array.new(2, Array.new(2, 0)) 
arr4 = [[0, 0], [0, 0]] 

arr3 == arr4 # => true 
arr3 === arr4 # => true 

arr3[0][0] = "/" 
arr4[0][0] = "/" 

arr3 # => [["/", 0], ["/", 0]] 
arr4 # => [["/", 0], [0, 0]] 

ответ

4

arr3 Поскольку содержит два идентичных объекта, но arr4 содержит два различных объектов.

>> arr3 = Array.new(2, Array.new(2, 0)) 
=> [[0, 0], [0, 0]] 
>> arr3.map { |ary| ary.object_id } 
=> [73703490, 73703490] 
>> arr4 = [[0, 0], [0, 0]] 
=> [[0, 0], [0, 0]] 
>> arr4.map { |ary| ary.object_id } 
=> [73670930, 73670920] 
>> 

Read new(size=0, default=nil)

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

arr3 Вы создали, используя форму выше, при создании arr4 с использованием буквального конструктора [].

Новый массив может быть создан using the literal constructor []. Массивы могут содержать различные типы объектов.

Если вы хотите Array::new вести себя как буквальное конструкцию, а затем перейти с new(size) {|index| block } форме.

>> arr3 = Array.new(2){ Array.new(2, 0) } 
=> [[0, 0], [0, 0]] 
>> arr3.map { |ary| ary.object_id } 
=> [73551460, 73551450] 
>> 
+0

@sawa Я закончил .. Исправления приветствуются от вас .. :) –

-2

Два элемента в arr3 одни и те же object_id, так что они будут изменены вместе.

КОД:

arr3.each do |item| 
    p item.object_id 
end 

arr4.each do |item| 
    p item.object_id 
end 

Но я до сих пор не знаю, почему Array.new сделал это произошло.

+2

Предлагаю вам сделать комментарий к ответу @ Arup. –

+0

_I до сих пор не знаю, почему 'Array.new' делает это. - Вы читали ссылку _doco_, я уже упоминал? –

+0

Это не комментарий. Я отвечал себе в то же самое время с ответом @ Arup. Я только что видел это после того, как я разместил его. Благодарим вас за ответ и ссылку на документ. –

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