为什么哈希值得到的影响在红宝石

问题描述:

mainhash = { 'A' => [ 0,1,2,3,4 ] , 'B' => [ 0 ,1,2 ,3 ] } 

ahash = mainhash['A'] 

indval = ahash.shift 

ahash成为如下为什么哈希值得到的影响在红宝石

[1, 2, 3, 4] 

mainhash成为如下

{"A"=>[1, 2, 3, 4], "B"=>[0, 1, 2, 3]}  

我操纵ahash变量由从ahash移位的一些值,当我做这个操作会影响mainhash的值。为什么会发生?

我错过了任何概念理解?

这是因为ahashmainhash都具有相同的Array实例的引用。如果通过ahash修改此参考对象,那么难怪它也会在mainhash中发生变化。的对象,而不是对同一对象的

要在拷贝操作(浅拷贝,要准确),你应该使用dup方法:

ahash = mainhash['A'].dup 

查找Array#shift

移除自的第一元素,并返回它(变速所有其它元素向下通过一个)。如果数组为空,则返回nil。

mainhash = { 'A' => [ 0,1,2,3,4 ] , 'B' => [ 0 ,1,2 ,3 ] } 

ahash = mainhash['A'] 
p ahash.object_id # => 8577888 
p mainhash['A'].object_id # => 8577888 
p indval = ahash.shift # => 0 

如上所见,ahashmainhash['A']指代相同Array对象[ 0,1,2,3,4],从而改变ahash#shift原因0ahash这也导致0mainhash['A']去除被移除。

说你哈希变成如下:

mainhash 
# => {"A"=>[1, 2, 3, 4], "B"=>[0, 1, 2, 3]} 

所有的操作都是合法的,如发生对文件的链接,我已经在上面给出。

我怎样才能避免影响mainhash

作为@Marek Lipka的说:

你应该使用DUP方法:ahash = mainhash [ 'A'] DUP

mainhash = { 'A' => [ 0,1,2,3,4 ] , 'B' => [ 0 ,1,2 ,3 ] } 

ahash = mainhash['A'].dup 
ahash.object_id # => 8577516 
mainhash['A'].object_id # => 8577600 
indval = ahash.shift # => 0 
ahash # => [1, 2, 3, 4] 
mainhash['A'] # => [0, 1, 2, 3, 4] 
+0

我该如何避免影响mainhash,但我仍然想要复制并操作 – Pavunkumar

+2

@Pavunkumar您应该使用'dup'方法:'ahash = mainhash ['A']。dup'。 –

为什么它正在发生?

arr = [1, 2, 3] 
x = arr 

arr.shift 

p arr 
p x 

--output:-- 
[2, 3] 
[2, 3] 

ARR并且x都指代相同的阵列。赋值('=')不会创建副本。

现在看这段代码:

arr = [1, 2, 3] 
x = arr.dup 

arr.shift 
p arr 
p x 

--output:-- 
[2, 3] 
[1, 2, 3] 

顺便说一下,名称为“ahash”是一个数组一个可怕的名字。