我有一个数组。
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}]
任何人都可以向我解释一下。因为这有点令人困惑。在此先感谢。
因为数组内的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
的不同对象”>
希望有帮助!
[当我们考虑array
或hash
之类的可枚举数据时,它通过提供引用来起作用,