反映数组中散列的值 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_id
和 hash.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
的不同对象
希望对您有所帮助!
当我们考虑像array
或hash
这样的可枚举数据时,它通过提供引用来工作,
您可以简要阅读 HERE,
你可以有如下简单的例子,
ar1 = [23]
# => [23]
ar2 = ar1
# => [23]
ar2 << 34
# => [23, 34]
ar1
# => [23, 34]
您可以通过 new
关键字创建新对象而不是传递现有可枚举对象的引用来避免此行为。
我有一个数组。
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_id
和 hash.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
希望对您有所帮助!
当我们考虑像array
或hash
这样的可枚举数据时,它通过提供引用来工作,
您可以简要阅读 HERE,
你可以有如下简单的例子,
ar1 = [23]
# => [23]
ar2 = ar1
# => [23]
ar2 << 34
# => [23, 34]
ar1
# => [23, 34]
您可以通过 new
关键字创建新对象而不是传递现有可枚举对象的引用来避免此行为。