为什么哈希值得到的影响在红宝石
问题描述:
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的值。为什么会发生?
我错过了任何概念理解?
答
这是因为ahash
和mainhash
都具有相同的Array
实例的引用。如果通过ahash
修改此参考对象,那么难怪它也会在mainhash
中发生变化。的对象,而不是对同一对象的
要在拷贝操作(浅拷贝,要准确),你应该使用dup
方法:
ahash = mainhash['A'].dup
答
移除自的第一元素,并返回它(变速所有其它元素向下通过一个)。如果数组为空,则返回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
如上所见,ahash
和mainhash['A']
指代相同Array对象[ 0,1,2,3,4]
,从而改变ahash#shift
原因0
从ahash
这也导致0
从mainhash['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]
答
为什么它正在发生?
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”是一个数组一个可怕的名字。
我该如何避免影响mainhash,但我仍然想要复制并操作 – Pavunkumar
@Pavunkumar您应该使用'dup'方法:'ahash = mainhash ['A']。dup'。 –