2016-11-20 23 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]