反映数组中散列的值 Rails

Reflecting value of hash in Array Rails

我有一个数组。

arr = []

我有一个哈希

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

在数组中添加散列

arr << hash

arr 的值是:

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

现在在哈希中添加值

hash[:d] = 4

现在看到数组的值是:

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

谁能给我解释一下。因为这有点令人困惑。 提前致谢。

因为数组里面的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 中所做的任何更改也将反映在 [=18 中的哈希中=] 因为是同一个对象。

现在,如果您不想看到该行为,请创建一个新对象,使用 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

的不同对象

希望对您有所帮助!

当我们考虑像arrayhash这样的可枚举数据时,它通过提供引用来工作,

您可以简要阅读 HERE,

你可以有如下简单的例子,

ar1 = [23]
# => [23] 
ar2 = ar1
# => [23] 
ar2 << 34
# => [23, 34] 
ar1
# => [23, 34] 

您可以通过 new 关键字创建新对象而不是传递现有可枚举对象的引用来避免此行为。