array = [1,2,3,4,5]
array1 = array
array2 = array.dup
puts array1 == array2
为什么我们可以在与另一个变量签约时使用dup
方法?
答案 0 :(得分: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
你会发现底层数组对象是不同的,即使==
表示内容相同。
答案 1 :(得分: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]
答案 2 :(得分: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]