array = [1,2,3,4,5]
array1 = array
array2 = array.dup
puts array1 == array2
为什么我们有一个dup
方法,当我们可以对另一个变量进行赋值?= vs .dup方法的使用
array = [1,2,3,4,5]
array1 = array
array2 = array.dup
puts array1 == array2
为什么我们有一个dup
方法,当我们可以对另一个变量进行赋值?= vs .dup方法的使用
。类似的说法:
array1 = array
刚刚从分配一个array
参考向array1
。这意味着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]