2013-07-02 39 views
-2
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的值。爲什麼會發生?

我錯過了任何概念理解?

回答

3

這是因爲ahashmainhash都具有相同的Array實例的引用。如果通過ahash修改此參考對象,那麼難怪它也會在mainhash中發生變化。的對象,而不是對同一對象的

要在拷貝操作(淺拷貝,要準確),你應該使用dup方法:

ahash = mainhash['A'].dup 
3

查找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'。 –

0

爲什麼它正在發生?

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」是一個數組一個可怕的名字。