具有相同对象ID的数组内的值

时间:2019-05-29 07:15:30

标签: ruby-on-rails arrays ruby

最近我在玩数组,发现一个奇怪的行为。我使用Array.new创建了一个新数组。

arr = Array.new(4,"happy")

["happy", "happy", "happy", "happy"]

我在该数组的第二个元素中添加了一个单词,如下所示

arr[1] <<" Dino"

当我看arr时,我期望的是第二个元素带有附加词的数组。但是令我惊讶的是,数组返回了所有带有附加单词的元素。

["happy Dino", "happy Dino", "happy Dino", "happy Dino"]

这怎么可能发生?创建数组时,是否要创建相同字符串的副本?如果使用arr[1]= " Dino",则不会发生这种情况。有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

是的,你是对的。参见ruby docs

  

发送大小和可选的默认值后,将使用默认大小的副本创建一个数组。请注意,所有元素都将引用相同的默认对象。

您可以通过以下方式初始化数组:

arr = Array.new(4){ 'happy' }

答案 1 :(得分:2)

当我们使用Array.new(4,“ Happy”)时,它将创建4个具有相同对象ID的元素。我们可以在irb arr[1].object_id => 2880099arr[2].object_id => 2880099中观察到,其余2个元素也将返回相同的对象ID。

因此,当我们尝试使用arr[1] << "Something"时,此字符串将附加到所有相同的对象ID。

现在,如果我们为 arr 选择另一个元素,例如arr.push("newString")。现在,如果看到最后一个元素对象ID arr.last.object_id => 4889988,则现在有所不同。

因此,如果我们尝试相同的命令arr[1] << "Something",则对新插入的元素将无效,因为对象ID不同。

如果您不希望出现这种情况,请使用Array.new(4){ 'String' }