`Array#<<`如何工作?

时间:2016-03-10 12:54:00

标签: arrays ruby immutability

假设我按如下方式声明数组:

array1 = [1,2,3,4,5]
array2 = array1

两个数组的对象ID相同:

array1.object_id = 118945940
array2.object_id = 118945940

当我在数组中插入元素时,如下所示

array1 << 10

结果是

array1 = [1, 2, 3, 4, 5, 10]
array2 = [1, 2, 3, 4, 5, 10]

但是当我将新数组添加到数组array1时,

array1 = array1 + [11,12]

array1 = [1,2,3,4,5,10,11,12]
array2 = [1,2,3,4,5,10]

两个数组的对象ID都已更改。

<<如何运作?

2 个答案:

答案 0 :(得分:3)

我认为这里的混淆是因为连接两个数组实际上创建了一个新数组(即:一个新对象)。

array1 + array2

这将创建一个新数组,其中包含两个数组的内容。所以对象id会改变,因为它是一个不同的对象。

当你使用<<运算符时,它只是向数组添加一个元素 - ruby​​不会创建一个新对象,因此两个数组(共享一个对象id)都会获得新元素。

答案 1 :(得分:1)

array是一个变量,包含一个引用(指针,句柄,ID - 无论你想调用它)到实际数组(类Array的实例)。

array (variable)   -------------------> object (instance of class Array)

您的代码有什么作用?我们来看看:

array << value

这与调用方法完全相同:array.append(value)。没有创建Array的新实例。您没有为变量array分配新值。实际的数组对象当然是在改变,但不是它的参考。

array1 = array1 + array2

作业的右侧array1 + array2必须创建一个新的Array实例。这很容易看到 - 代码直观地不应该修改array1array2。然后,对这个新数组的引用存储在变量array1