假设我按如下方式声明数组:
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都已更改。
<<
如何运作?
答案 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
实例。这很容易看到 - 代码直观地不应该修改array1
或array2
。然后,对这个新数组的引用存储在变量array1
。