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]