2016-11-20 53 views
-2
array = [1,2,3,4,5] 

array1 = array 
array2 = array.dup 

puts array1 == array2 

为什么我们有一个dup方法,当我们可以对另一个变量进行赋值?= vs .dup方法的使用

回答

1

。类似的说法:

array1 = array 

刚刚从分配一个array参考array1。这意味着arrayarray1都指向相同的内存位置。如果你改变了底层阵列,这将反映在两个副本:

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是真实的,即使ab参考不同的阵列。

一般而言,=简单地拷贝的参考用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]