array = [1,2,3,4,5]
array1 = array
array2 = array.dup
puts array1 == array2
Почему у нас есть метод dup
, когда мы можем просто присвоить другую переменную?Использование метода = vs .d
array = [1,2,3,4,5]
array1 = array
array2 = array.dup
puts array1 == array2
Почему у нас есть метод dup
, когда мы можем просто присвоить другую переменную?Использование метода = vs .d
заявление как:
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]
Вы обманываем себя по:
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
вы увидите, что базовые объекты массива различны, даже если ==
говорит о том, что имеет равное содержание.
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]