2016-11-20 2 views

ответ

1

заявление как:

array1 = array 

просто присваивает ссылку на array1 от array. Это означает, что оба array и array1 указывают на то же место памяти. Если вы изменяете исходный массив, это будет отражено в обоих экземплярах:

irb(main):001:0> array = [1,2,3] 
=> [1, 2, 3] 
irb(main):002:0> array1 = array 
=> [1, 2, 3] 
irb(main):003:0> array 
=> [1, 2, 3] 
irb(main):004:0> array1 
=> [1, 2, 3] 
irb(main):005:0> array[0] = 10 
=> 10 
irb(main):006:0> array 
=> [10, 2, 3] 
irb(main):007:0> array1 
=> [10, 2, 3] 

Если вы используете dup, он клонирует исходных данных, создание нового, независимого хранения:

irb(main):008:0> array2 = array.dup 
=> [10, 2, 3] 
irb(main):009:0> array 
=> [10, 2, 3] 
irb(main):010:0> array2 
=> [10, 2, 3] 
irb(main):011:0> array2[0] = 20 
=> 20 
irb(main):012:0> array 
=> [10, 2, 3] 
irb(main):013:0> array2 
=> [20, 2, 3] 
2

Вы обманываем себя по:

  1. Попытка объяснения причин из одного примера.
  2. Сравнение неправильных вещей.

Array имеет свой собственный == method, сравнивающий поэлементно так дал:

a = [ 11 ] 
b = [ 11 ] 

тогда a == b верно, даже если a и b ссылки на разные массивы.

В общем, = просто копирует ссылки на аналогичные этому в C:

int *i, *j; 
i = j; 

но dup делает (мелкой) копию.

Если сравнить object_id S:

puts array1.object_id == array2.object_id 

вы увидите, что базовые объекты массива различны, даже если == говорит о том, что имеет равное содержание.

2
array = [1,2,3,4,5] 

array1 = array 
array2 = array.dup 

array << "aha" 
p array1 # => [1, 2, 3, 4, 5, "aha"] 
p array2 # => [1, 2, 3, 4, 5] 
Смежные вопросы