数组Rails中哈希的反映值

问题描述 投票:0回答:2

我有一个数组。

arr = []

我有一个哈希

hash = {a: 1, b: 2, c: 3}

数组中的Addind哈希

arr << hash

arr的值是:

[{:a=>1, :b=>2, :c=>3}] 

现在在哈希中添加值

hash[:d] = 4

现在查看数组的值为:

[{:a=>1, :b=>2, :c=>3, :d=>4}]

任何人都可以向我解释一下。因为这有点令人困惑。在此先感谢。

arrays ruby-on-rails ruby hash ruby-hash
2个回答
0
投票

因为数组内的hash也具有相同的object_id,所以让我们用一个例子来尝试它

2.6.3 :008 > arr = []
 #=> [] 
2.6.3 :009 > hash = {a: 1, b: 2, c: 3}
 #=> {:a=>1, :b=>2, :c=>3} 
2.6.3 :010 > arr << hash
 #=> [{:a=>1, :b=>2, :c=>3}] 
2.6.3 :011 > arr.first.object_id
 #=> 70240020878720 
2.6.3 :012 > hash.object_id
 #=> 70240020878720

如您所见,arr.first.object_idhash.object_id都具有相同的object_id,因此您在hash中所做的任何更改也将反映在arr内部的哈希中,因为它们是同一对象。

现在,如果您不想看到该行为而不是创建一个新对象,请使用dup,请尝试此操作

2.6.3 :001 > arr = []
 #=> [] 
2.6.3 :002 > hash = {a: 1, b: 2, c: 3}
 #=> {:a=>1, :b=>2, :c=>3} 
2.6.3 :003 > arr << hash.dup
 #=> [{:a=>1, :b=>2, :c=>3}] 
2.6.3 :004 > arr.first.object_id
 #=> 70094898530860 
2.6.3 :005 > hash.object_id
 #=> 70094898418620 
2.6.3 :006 > hash[:d] = 4
 #=> 4 
2.6.3 :007 > arr
 #=> [{:a=>1, :b=>2, :c=>3}] 
2.6.3 :008 > hash
 #=> {:a=>1, :b=>2, :c=>3, :d=>4} 

dup创建了一个新对象,因此您不会在两个地方都看到所做的更改,因为两者都是具有不同object_id的不同对象”>

希望有帮助!


0
投票

[当我们考虑arrayhash之类的可枚举数据时,它通过提供引用来起作用,

© www.soinside.com 2019 - 2024. All rights reserved.