我有一个数组和一个整数:
ary = [2, 5, 4]
num = 6
如果我定义一个名为this
的新数组,它与ary
相同:
this = ary
我在this
添加了一个数字:
this << num
当我检查数组时,它们都是相同的:
p this
#=>[2, 5, 4, 6]
p ary
#=>[2, 5, 4, 6]
我只想为this
添加一个数字,而ary
仍应为:
ary = [2, 5, 4]
为什么会发生这种情况?如何阻止ary
添加号码?
答案 0 :(得分:2)
ary
和this
都是对同一个Array实例的引用,当你使用其他变量引用数组时,操作的副作用就会显示出来。
如果您不想要任何副作用,请使用ary.dup
复制数组。
答案 1 :(得分:2)
您实际上并没有创建新阵列。你刚刚创建了一个引用同一个数组的第二个变量。
要制作新数组,您可以使用dup
:
array2 = array.dup
答案 2 :(得分:0)
这就是发生的事情:
ary = []
ary.object_id # => 70207239648660
object_id
返回对象的标识符,在这种情况下,它是ary
的Ruby的ID。每次运行代码时,该值都会发生变化,所以不要指望它与我的匹配。
new_ary = ary
new_ary.object_id # => 70207239648660
你可以看到Ruby说new_ary
和ary
是同一个对象。
ary << 1
ary # => [1]
new_ary # => [1]
如果我们更改ary
,则会更改new_ary
和new_ary << 2
ary # => [1, 2]
new_ary # => [1, 2]
。
new_ary = ary.dup
new_ary.object_id # => 70207239645700
反之亦然。
dup
如果我们使用new_ary << 3
ary # => [1, 2]
new_ary # => [1, 2, 3]
Ruby将内容复制到另一个变量空间并返回它。
ary
此时new_ary
和 .content {
overflow: hidden;
border: solid blue;
flex-grow: 1;
flex-shrink: 1;
height:450px; //adjust accordingly.
}
指向单独的对象,因此更改对象不会影响另一个。
答案 3 :(得分:0)
您可以使用返回数组深层副本的deep_dup()方法。
ary = [2, 5, 4]
num = 6
this = ary.deep_dup
this << num
然后检查 ary 和此数组:
p this
=>[2, 5, 4, 6]
p ary
=>[2, 5, 4]