如何分离重复的数组?

时间:2015-12-28 15:13:24

标签: arrays ruby

我有一个数组和一个整数:

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添加号码?

4 个答案:

答案 0 :(得分:2)

arythis都是对同一个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_aryary是同一个对象。

ary << 1
ary # => [1]
new_ary # => [1]

如果我们更改ary,则会更改new_arynew_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]