使用= vs .dup方法

时间:2016-11-20 18:27:53

标签: ruby

array = [1,2,3,4,5]

array1 = array
array2 = array.dup

puts array1 == array2

为什么我们可以在与另一个变量签约时使用dup方法?

3 个答案:

答案 0 :(得分:2)

你愚弄自己:

  1. 试图用一个例子来推理。
  2. 比较错误的事情。
  3. 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
    

    你会发现底层数组对象是不同的,即使==表示内容相同。

答案 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

只需从array1array分配引用即可。这意味着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]