首页 > 解决方案 > 在 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}]

谁能给我解释一下。因为这有点令人困惑。预先感谢。

标签: arraysruby-on-railsrubyhashruby-hash

解决方案


因为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_id两者hash.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

希望有帮助!


推荐阅读