【问题标题】:How does `Array#<<` work?`Array#<<` 是如何工作的?
【发布时间】:2016-06-25 07:59:47
【问题描述】:

假设我声明数组如下:

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 都发生了变化。

&lt;&lt; 是如何工作的?

【问题讨论】:

    标签: arrays ruby immutability


    【解决方案1】:

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

    array1 + array2
    

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

    当您使用&lt;&lt; 运算符时,它只是将一个元素添加到数组中 - ruby​​ 不会创建新对象,因此两个数组(共享一个对象 ID)都会获取新元素。

    【讨论】:

    • &lt;&lt;array.append 一样吗?
    • @Arc676 - 是的。这是我的意图。
    • 这篇帖子stackoverflow.com/questions/1801516/…,虽然与您的问题没有直接关系,但包含与您的问题相关的有用信息。
    • “没有需要创建新对象”是什么意思? &lt;&lt; 只是创建一个新对象。
    • @sawa - 可能是用词错误......我的意思是,将元素附加到数组不会创建新对象。您不需要使用创建新对象的代码/方法。
    【解决方案2】:

    array 是一个变量,其中包含对实际数组(Array 类的实例)的引用(指针、句柄、ID - 无论您想调用什么)。

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

    您的代码是做什么的?让我们看看:

    array << value
    

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

    array1 = array1 + array2
    

    赋值右侧array1 + array2 必须创建一个新的Array 实例。这很容易看出——代码直观地不应该修改array1array2。然后将这个新数组的引用存储在变量array1中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2017-09-01
      • 2014-11-04
      • 2016-04-17
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多