最近我在玩数组,发现一个奇怪的行为。我使用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"
,则不会发生这种情况。有人可以解释为什么会这样吗?
答案 0 :(得分:3)
是的,你是对的。参见ruby docs
发送大小和可选的默认值后,将使用默认大小的副本创建一个数组。请注意,所有元素都将引用相同的默认对象。
您可以通过以下方式初始化数组:
arr = Array.new(4){ 'happy' }
答案 1 :(得分:2)
当我们使用Array.new(4,“ Happy”)时,它将创建4个具有相同对象ID的元素。我们可以在irb arr[1].object_id => 2880099
,arr[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' }